Javascript函数作为回调

时间:2009-11-18 02:36:52

标签: javascript function

以下脚本生成“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”输出。

4 个答案:

答案 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 具有适当的范围。