错误的功能背景

时间:2015-10-24 08:25:45

标签: javascript

我希望函数的上下文(this)与其父/范围相同。不应该这样吗?

检查下面的示例,我希望_context获取 Object {foo: "bar"}的值,但我得到window个对象。

我的逻辑在哪里欺骗我?

var context = {
    foo: 'bar'
};
var _context;
var fn = (function () {

    console.log(this); // Object {foo: "bar"}
    function foo() {
        _context = this;
    }
    foo();
}.bind(context))();

console.log(_context); // window?! why?

jsFiddle:http://jsfiddle.net/1nz4dda3/

2 个答案:

答案 0 :(得分:1)

您通过调用windowfoo()上下文中明确地调用该函数。在JS this中引用了调用上下文,并且在内部编写任何函数的位置并不重要。

这是一篇关于JS方法上下文的好文章。

http://helephant.com/2009/11/29/javascript-method-context/

答案 1 :(得分:1)

功能是根据其调用方式或 bind 设置的。 ECMAScript 2015箭头函数从周围的执行上下文中获取 this

值不是"" context",它只是函数执行上下文的一个参数。

当你这样做时:

var fn = (function () {
  ...
}.bind(context))();

您将对象 context 绑定到IIFE的。但是,当您致电:

foo();

您尚未设置其参数,因此默认为全局对象(浏览器中的窗口)。在严格模式下,它将是未定义的。您从哪里调用 foo 并不重要,它是如何调用它来设置这个