javascript語言精粹筆記(三)函數

1. 函數對象
在javascript中 函數就是對象 所以相對應的也會有原型 對象字面量創建的對象會連接到object.prototype,而函數字面量創建的函數對象就會連接到function.prototype。每個函數在創建時會有兩個隱藏屬性函數上下文函數需要行爲代碼 我理解爲要乾的事 和 參與者。

2. 函數調用
函數的調用可以理解爲控制權的轉移,把參數和控制器傳入被調用的函數中,函數被調用時有兩個附加參數 thisarguments.this的值在不同調用模式下值不同,js有四種調用模式:方法調用模式,函數調用模式,構造器調用模式,apply調用模式。
javascript對於實參傳遞要求比較寬鬆 允許實參形參數量不一 且不對實參的類型做檢查

3. 方法調用模式
什麼是方法? 我們認爲把一個函數封裝在一個對象裏面,這個函數就是這個對象的方法
在對象的方法內可以調用this這時的this表示了當前的對象,通過這個this你可以獲取到這個對象的上下文屬性 這種方法叫做公共方法

var cat = {
    height:66,
    weight:55,
    num:function () {
        return this.height+this.weight;
    }
}

4. 函數調用模式

function add(a,b) {
    return a+b;
}

var sum = add(3,4);

當一個函數不是某個對象的方法時,被調用時的this指向爲一個全局對象

但我們通常的需求是綁定爲外部函數的this 我們可以這樣做

cat.double = function () {
    var that = this;
    that.value = 3;
    //
    var helper = function () {
        that.value = add(that.value,that.value);
    }

    helper();
}

cat.double();
console.log(cat.value);//這裏面還是訪問的cat而不是cat.double.value因爲這裏的double你理解爲這個對象的方法而不是什麼子類對象 這裏的this還是其cat本身

5. 構造器模式
所謂的構造器就是new的時候創建的工具 那麼javascript當方法被構造的時候 他會創建一個方法的副本 並且this指向這個new出來的對象 他的原型被鏈接成原對象的原型 比如下方

var a = function (string) {
    this.status = string;
}

a.prototype.getStatus =function () {
    return this.status;
}//爲所有a的原型創建了一個getStatus方法

var b = new a("hellow");
//綁定this爲b 也就是b的status爲hellow
console.log(b.getStatus());
//調用時通過原型查找到getStatus方法 並返回this也就是b的status字符串

//所以這個實驗證明了兩點 第一new會讓當前對象綁定爲this 第二 當前對象的原型會綁定到a的原型

但據說這樣不太好使

6. apply調用模式
javascript是一門以函數爲核心的語言 所以他的函數也有方法

var array = [3,4];
var sum = add.apply(null,array);
//通過apply我們可以重新指定this所指向的對象 這裏爲null 第二個參數爲參數數組
console.log(sum);

var statusObject = {
    status:"WoW"
}

console.log(a.prototype.getStatus.apply(statusObject));
//這裏儘管statusObject的原型和a的原型並沒有任何關係 但因爲調用了apply方法 所以this被重新定向爲statusObject 返回了他的status:"WoW"
var a = function (string) {
    this.status = string;

}

a.print = function () {

}

a.print.println = function () {
    console.log("fk");
}
a.print.println();

a.prototype.getStatus =function () {
    return this.status;

既然上面說了函數能狗擁有方法 這是我能唯一想到並且可以執行的方法添加方法 就是通過給函數對象添加函數屬性 如果是在裏面直接函數字面量聲明並不行 似乎是因爲這是一個函數對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章