0

我在玩 new、this 和 JavaScript,我遇到了一些东西,我不知道为什么 JavaScript 会这样。任何帮助我解决这个问题都会很棒。

可以说我有一个功能:


function X() {
    this.q = function() {
        console.log(this);
    };  

    console.log(this);
}

这按我的预期工作:


var x = new X();
=> X {q: function}

x.q();
=> X {q: function}

但这并不像我期望的那样:


function func(f) {
    f();
}

var x = new X();
=> X {q: function}

func(x.q);
=> Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
// I expected this to return "X {q: function}"

// But this works...
func(function() {x.q()});
=> X {q: function}

我似乎对 javascript 有一些误解,因为它在这种情况下的行为方式与我期望的方式完全不同。

4

3 回答 3

4

因为函数的上下文 ( this) 是由在 JavaScript中调用它的方式设置的,而不是像其他一些语言那样声明它的位置。

f()因此,当您像没有上下文一样调用函数时,它默认为,window但是当您像x.q()上下文一样调用它时,它是x实例。

如果我调用如下函数:

obj.something.deep.property.func();

在这种情况下,函数的上下文 ( this) 将是任何property内容。

(注意:如果没有确定上下文,那是严格模式thisundefined,不是window

于 2013-09-24T16:18:58.683 回答
1

这是因为上下文的值this, 是在函数运行时设置的,而不是在函数声明时设置的。

当你运行时x.q(),你是q()在对象的“上下文”中运行x,所以this里面q()x.

当您传递x.q()func()您时,您传递的是函数本身,而不是它的上下文。因此,当func()调用该函数时,它的上下文会丢失,因此它“默认”为window(“全局上下文”)。

于 2013-09-24T16:18:36.507 回答
0

您需要传递上下文:

func(x.q.bind(x));

这是因为当您传递x.q所有内容时,您传递的是函数:

function() {
    console.log(this);
};  

而且代码不知道this指的是什么。

于 2013-09-24T16:18:30.330 回答