2014-09-24 184 views
0

我最近開始閱讀「JavaScript:good parts」並引用了一個我無法理解的例子。我添加了一個test功能到原來的例子:JavaScript函數調用

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

var myObject = { 
    val: 0, 
    increment: function(inc) { 
     this.val += typeof inc == 'number' ? inc : 1; 
    } 
}; 

myObject.increment(12); 
myObject.increment(); 
// till this line, the val is equal to 13 

// function invocation 
myObject.double = function() { 
    var that = this; 

    // inner function #1 
    var helper = function() { 
     that.val = add(that.val, that.val); 
    }; 
    // inner function #2 
    var test = function(){ 
     this.val = add(this.val, this.val); 
    }; 

    helper(); // the val is equal to 26 
    // test(); // the val is equal to 13 
}; 

當我使用thatvar that = this)我指的myObject的字段,val。當我在test函數中使用這個時,我指的是同一個對象中的同一個字段,但答案不同。任何解釋將不勝感激。

回答

1

嘗試在瀏覽器控制檯運行此代碼:

var obj = { 
    val: 0 
}; 

obj.func = function() { 
    var that = this; 

    console.log(this); // this refers to obj 

    var test1 = function() { 
     console.log(this); 
    }; 

    test1(); // this refers to the global scope or window 

    var test2 = function() { 
     console.log(that); 
    } 

    test2(); // this or that refers to obj 
} 

obj.func(); 

在JavaScript中,關鍵字this可以是相當棘手的。 this的值取決於函數的調用方式。第一個console.log顯示obj.func內的this是指obj。對於下一個示例,關鍵字this位於功能test1的範圍內。更重要的是,test1被稱爲不同於obj.func。因爲test1在左邊沒有點(作爲對象的屬性)被調用,所以關鍵字this實際上指的是全局範圍。您可以考慮運行如window.test1()的代碼。最後一個例子說明了爲什麼行var that = this是有用的,它維護的上下文爲obj

+0

感謝您的示例代碼 – Yar 2014-09-24 02:08:59

1

當您在

var test = function(){ 
    this.val = add(this.val, this.val); 
}; 

this使用this實際上是指test,不myObject,因此this.val是不確定的,其實this.val = add(this.val, this.val);什麼也不做。這就是val值沒有改變的原因。