在方法中访问javascript对象的属性

时间:2015-10-03 06:44:56

标签: javascript jquery

对于下面的代码片段,我希望答案为“数字”,但我将其视为“未定义”。任何人都可以帮我在这里找出它为什么返回“未定义”?

var foo = {
    bar: function () {
        return this.baz;
    },
    baz: 1
};

(function () {
    return typeof arguments[0](); //this will return "undefined"
})(foo.bar);

如果我输入fof.bar(),那么它会给我预期的答案为“数字”。

提前致谢。

1 个答案:

答案 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;
&#13;
&#13;

2)使用您自己的包装函数:

&#13;
&#13;
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;
&#13;
&#13;