JavaScript - 关于`this`关键字的谜团

时间:2014-04-10 09:11:22

标签: javascript

根据我的理解,如果'这个'关键字用在函数中,然后它总是引用函数的所有者。但在以下情况中,为什么'这个'无法找到所有者对象的对象属性 -

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 property',因为' callingMethod'属于' callingObj'并且' callingObj'已经有一个' objectProperty'属性。那么为什么这个'无法识别它?

2 个答案:

答案 0 :(得分:3)

this指的是上下文,无论上下文是什么。

当你写callbackF()时,没有上下文!您已取消引用该功能,因此this不是您所期望的。

callbackF.call(calledObj);将起作用,因为这会明确地将上下文设置回您想要的内容。

答案 1 :(得分:0)

在Javascript中,函数没有特定的所有者。一个或多个对象可以引用该函数,或者根本没有对象。

函数内this的值仅取决于您调用函数的方式。如果您使用句点语法来调用它,或使用call methodapply methodthis的值就是您指定的对象。

示例:

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'