作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在浏览器控制台中做了一个 JavaScript 实验 -
首先我创建了一个新对象 foo 如下
var foo = {
bar: function() { return this.baz; },
baz: 1
};
现在,当我在控制台中再次运行以下代码时,它会返回“number”
(function(){
return typeof foo.bar();
})();
但是当我运行以下匿名函数时,它返回“未定义”
(function(){
return typeof arguments[0]();
})(foo.bar);
据我所知,上面函数中的arguments[0]
返回foo.bar
(也由下面的示例证明)那么为什么上面的代码返回 “未定义”
而不是“number”
?
当我运行时
(function(){
return arguments[0];
})(foo.bar);
返回function () { return this.baz; }
还有
(function(){
return typeof arguments[0];
})(foo.bar());
返回“number”
那为什么不呢
(function(){
return typeof arguments[0]();
})(foo.bar);
返回相同吗? JavaScript 中有什么基本法则在这里发挥作用吗?
最佳答案
this
取决于您调用该函数的方式。当使用点表示法时,JavaScript 将 this
的上下文设置为接收者。在您的情况下,没有接收者,而是对函数的引用,因此您丢失了上下文。您必须显式传递它:
arguments[0].call(foo);
arguments[0]
与 foo.bar
是相同的函数对象,但 this
的值是动态的。在 foo.bar()
中,this
被分配给 foo
,因为您使用了 foo.
(点表示法)。但在 arguments[0]()
中没有点(没有接收器),因此 this
是默认值,或 window
。
这是相同的函数但不同的调用。
关于javascript - 做了一些 javascript 实验,需要你的帮助来理解意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20603381/
我是一名优秀的程序员,十分优秀!