2014-04-10 86 views
0

根據我的理解,如果'this'關鍵字用在函數中,那麼它總是指向函數的所有者。但在下列情況下,爲什麼「這個」無法找到車主對象的對象屬性 -JavaScript - 圍繞`this`關鍵字的祕密

var calledObj = {}; 
calledObj.objectProperty = 'calledObj property'; 
calledObj.calledMethod = function(){ 
    alert(this.objectProperty); 
} 

var callingObj = { 
    objectProperty: 'callingObj property', 
    callingMethod: function(callbackF){ 
     if(typeof callbackF !== 'function'){ 
      callbackF = false; 
     } 
     if(callbackF){    
      callbackF(); 
     } 
    } 
}; 
callingObj.callingMethod(calledObj.calledMethod); // alert 'UNDEFINED' 

它應提醒「callingObj財產」,因爲「callingMethod」屬於「callingObj」和「callingObj」已經有'objectProperty'屬性。那麼爲什麼'這個'不能識別它呢?

+1

又一'this'問題。 :-) – techfoobar

回答

0

在Javascript中,函數沒有特定的所有者。一個對象或多個對象可以具有對該功能的引用,或者根本沒有對象。

函數內部的值this僅取決於您如何調用該函數。如果使用句點語法來調用它,或使用call methodapply method,則值this是您指定的對象。

例子:

someObj.func(); // using period syntax the value for 'this' is someObj 

func.call(someObj); // providing a value for 'this' 

當您使用期語法,而不調用該函數,你剛纔得到的參考功能,並且它沒有連接到該對象。使用引用調用函數將不會爲this提供值,因此如果代碼在瀏覽器中運行,則該值將是全局上下文,即window對象。

實施例:

var f = someObj.func; // get the reference 

f(); // call the function without a value for 'this' 

f.call(someObj); // call the function specifying a value for 'this' 
+0

Guffia,如果我在func()方法中使用'this',那麼根據您的評論,它將始終指向一個全局對象,前提是我使用了句法語法。如果它是真的,那麼如果我使用這樣的'someObj.property =「hello」; someObj.func = function(){alert(this.property)}; someObj.func()',那麼它應該提醒'undefined',因爲全局對象中不存在'property' –

+0

@YashGarg:對不起。如果使用句點語法,'this'的值就是您獲得函數引用的對象。我會盡量讓答案更清楚。 – Guffa

3

this引用上下文,無論上下文是什麼。

當你寫callbackF(),沒有上下文!您已取消了該功能,因此this不是您所期望的。

callbackF.call(calledObj);將工作,因爲這明確地設置上下文回到你想要它。

+0

還有那個詞,「上下文」。 ECMA-262中上下文和* this *之間的唯一關係是關於[* execution context *](http://ecma-international.org/ecma-262/5.1/#sec-10.3),其中* this *是一個參數。函數的* this *是一個參數,可以通過調用設置爲任何對象(或使用[* bind *](http://ecma-international.org/ecma-262/5.1/#sec-15.3.4.5 ))或嚴格模式下的任何值。 MDN在[*此*]上有一篇相當不錯的文章(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)。 – RobG

+0

Niet,在這種情況下,說'這'指'全局對象'是否正確? –

+0

是的,因爲* this *的值未在通話中設置。你可以這樣做:調用obj.callingMethod(function(){calledObj.calledMethod()})'這樣* this *被設置爲所需的值並且* callingObj *不需要知道任何關於* calledObj *或者* calledObj .calledMethod *,它只是調用它傳遞的函數,並且該函數設置* this *。 – RobG