以下脚本生成“Hello”,“undefined”,“Hello”消息框:
function action(callback) {
window.setTimeout(callback, 1000);
}
var obj = {
text: "Hello",
f: function() { window.alert(this.text); }
};
obj.f(); // Line 1
action(obj.f); // Line 2
action(function() { obj.f(); }); // Line 3
我在寻找解释为什么标记为“Line 2”的行会产生“undefined”输出。
答案 0 :(得分:3)
在JavaScript中,this
未绑定到该方法(如在python中)。第2行导致只调用函数,this
未定义或不obj
答案 1 :(得分:2)
当你调用line2时:你只是将函数传递给参数。由于您只传递函数而不是整个对象,因此函数中的this
未引用obj
,因此this.text
未定义。
答案 2 :(得分:1)
很多JS库都是这样的:
if (!Function.prototype.context) {
Function.prototype.context = function (object) {
var fn = this;
return function () { return fn.apply(object, arguments); };
};
}
能够将this
传递给绑定程序。
所以在你的情况下,你可以像这样做smthg
action(obj.f.context(obj));
并收到你的'你好'。是的,这是在第3步中完成某项工作的一般方法。
答案 3 :(得分:0)
第二个传递没有范围的函数,因此这个成为范围链中的最高对象。第三种方法是创建一个闭包并直接在对象上调用f,使 this 具有适当的范围。