2014-04-10 117 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