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
. Why?
了解原因this
不是对函数所在对象的引用,您必须了解 JavaScript 没有类。它有功能。
在 JavaScript 中,函数从来不会像 Java、C# 等类语言中那样严格“绑定”到对象。 javascript 函数只是另一种类型,例如string
and number
,这意味着您可以像任何其他类型一样在变量中传递函数。在您的示例中,函数包含在foo.bar
不知道foo
根本不。这只是一个功能,管好自己的事。
那么什么是this
关键字做什么?它指向执行上下文。在你的例子中,你调用里面的函数foo.bar
从全球范围(即window
),这就是它所指向的。您可以使用apply()
在正确的作用域中调用该函数,但为此您需要访问该作用域(在本例中,foo
目的)。这否定了仅传递函数而不传递对象的任何安全优势。
为了“解决”这个“问题”,ECMAScript 5(JavaScript 的未来版本)引入了bind()。这个方便的函数允许您在将函数传递给另一个函数之前将其绑定到特定的执行范围,如下所示:
var foo = {
bar: function() { return this.baz; },
baz: 1
};
var callback = foo.bar.bind(foo);
(function(){
return typeof arguments[0]();
}(callback));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)