2009-11-18 147 views
0

下面的脚本会产生“你好”,“不确定”,“你好”消息框:JavaScript函数回调

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 

我找的解释,为什么行标记为“2号线”生产“未定义”输出。

+1

''这个'主题的最佳答案:http://stackoverflow.com/questions/80084/in-javascript-why-is-the- this-operator-inconsistent/80478#80478 and http://stackoverflow.com/questions/541167/what-is-the-rationale-for-the-behavior-of-the-this-keyword-in-javascript/542060# 542060 – 2009-11-18 02:44:18

+0

第一个引用真的很好 – LicenseQ 2009-11-18 02:53:20

回答

3

在JavaScript中,this没有绑定到方法(就像在Python中)。 2分线的结果只是被调用的函数,并this未定义或不obj

2

当您呼叫line2时:您只是将该函数传递给参数。由于您只是传递函数,而不是整个对象,所以在函数调用时,函数this没有引用obj,因此使得this.text未定义。

+2

实际上,_this_在该上下文中表示全局对象 - 在这种情况下,_window_ – 2009-11-18 02:50:46

+0

更新说明 – mauris 2009-11-18 06:48:41

0

第二个传递函数没有范围,所以这个成为范围链中的最高对象。第三种方法是在对象上直接创建一个闭包并调用f,使这个具有适当的范围。

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步完成的一些事情。