执行上下文和((此对象))

时间:2014-08-31 00:15:13

标签: javascript

//我不明白为什么这不起作用

y = 'window';
var x = {
    y : 'x',
    func : function(){
        return function(){
            return this.y
        }
    }
};

x.func()();

// when I execute x.func()() I understand why it should return y
// x.func() would return a function in the global context and then execute it ' should return 'window' '
y = 'window'
var x = {
    y : 'x',
    func : function(){
        return function(){
            return this.y
        }()
    }
};

x.func();

为什么这段代码也会返回' window'它在x对象内部执行

1 个答案:

答案 0 :(得分:1)

调用x.func()()使用x.func作为上下文调用函数x,然后使用无上下文调用它返回的值。定义函数无关紧要;只是如何调用它。

为避免这种情况,您可以在返回之前将函数绑定到特定上下文:

var x = {
    y: 'x',
    func: function() {
        return function() {
            return this.y;
        }.bind(this);
    }
};

ES6箭头函数也使用词汇this,相当于bind

var x = {
    y: 'x',
    func: function() {
        return () => this.y;
    }
};