var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
为什么这段代码返回undefined
?
我假设 arguments[0]
会保存 foo.bar
,这是一个函数。当通过 arguments[0]()
调用时,它应该返回函数评估的结果,在本例中为 1
。因此,typeof arguments[0]()
应该返回“Number”(如 typeof 1
)。相反,它返回 undefined
。为什么?
最佳答案
理解为什么this
不是对函数所在对象的引用,您必须了解 JavaScript 没有类。它有功能。
在 JavaScript 中,函数永远不会像在 Java、C# 等有类语言中那样严格地“绑定(bind)”到对象。 JavaScript 函数只是另一种类型,例如 string
和 number
,这意味着您可以像任何其他类型一样在变量中传递函数。在您的示例中,foo.bar
中包含的函数不知道foo
根本。这只是一个功能,管好自己的事。
那么 this
是什么意思?关键字做什么?它指向执行上下文。在您的示例中,您调用 foo.bar
中的函数来自全局范围(即 window
),这就是它所指向的。您可以使用 apply()
在正确的范围内调用函数,但为此您需要访问该范围(在本例中为 foo
对象)。这否定了仅传递函数而不传递对象的任何安全优势。
为了“解决”这个“问题”,ECMAScript 5(JavaScript 的 future 版本)引入了 bind()
强>。这个方便的函数允许您在将函数传递给另一个函数之前将它绑定(bind)到某个执行范围,如下所示:
var foo = {
bar: function() { return this.baz; },
baz: 1
};
var callback = foo.bar.bind(foo);
(function(){
return typeof arguments[0]();
}(callback));
关于javascript - 函数参数传递和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587730/