根据我的理解,如果'这个'关键字用在函数中,然后它总是引用函数的所有者。但在以下情况中,为什么'这个'无法找到所有者对象的对象属性 -
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'属性。那么为什么这个'无法识别它?
答案 0 :(得分:3)
this
指的是上下文,无论上下文是什么。
当你写callbackF()
时,没有上下文!您已取消引用该功能,因此this
不是您所期望的。
callbackF.call(calledObj);
将起作用,因为这会明确地将上下文设置回您想要的内容。
答案 1 :(得分:0)
在Javascript中,函数没有特定的所有者。一个或多个对象可以引用该函数,或者根本没有对象。
函数内this
的值仅取决于您调用函数的方式。如果您使用句点语法来调用它,或使用call
method或apply
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'