对于下面的代码片段,我希望答案为“数字”,但我将其视为“未定义”。任何人都可以帮我在这里找出它为什么返回“未定义”?
var foo = {
bar: function () {
return this.baz;
},
baz: 1
};
(function () {
return typeof arguments[0](); //this will return "undefined"
})(foo.bar);
如果我输入fof.bar(),那么它会给我预期的答案为“数字”。
提前致谢。
答案 0 :(得分:3)
因为具有正常功能的this
由如何调用函数而不是它定义的位置设置。 (ECMAScript2015' s"箭头"功能不同,他们从他们创建的地方继承this
,而不是他们如何被调用。)
您有几个选择:
1)使用Function#bind
创建一个新功能,在调用时,将使用正确的this
调用原始函数:
var foo = {
bar: function() {
return this.baz;
},
baz: 1
};
(function() {
snippet.log(typeof arguments[0]());
})(foo.bar.bind(foo));

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
2)使用您自己的包装函数:
var foo = {
bar: function() {
return this.baz;
},
baz: 1
};
(function() {
snippet.log(typeof arguments[0]());
})(function() {
return foo.bar.apply(foo, arguments);
});
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;