用新的和这个Javascript关闭

时间:2013-09-24 16:15:08

标签: javascript

我正在使用新的,这个和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的东西,因为它在这种情况下的表现方式与我的预期完全不同。

3 个答案:

答案 0 :(得分:4)

因为函数的上下文(this)是由如何在JavaScript中调用而不是设置的,就像其他语言一样。< / p>

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

如果我调用了一个函数:

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

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

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

答案 1 :(得分:1)

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

当您运行x.q()时,您在q()对象的“上下文”中运行x,因此this内的q()为{{1} }}

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

答案 2 :(得分:0)

您需要传递上下文:

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

这是因为当您传递x.q时,您传递的只是函数:

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

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