使用new和this的Javascript闭包

使用new和this的Javascript闭包,javascript,Javascript,我在玩new、this和JavaScript时遇到了一些东西,我不知道JavaScript为什么会这样。如果能帮我解决这个问题,那就太好了 假设我有一个函数: function X() { this.q = function() { console.log(this); }; console.log(this); } function() { console.log(this); }; 正如我所期望的那样: var x = new

我在玩new、this和JavaScript时遇到了一些东西,我不知道JavaScript为什么会这样。如果能帮我解决这个问题,那就太好了

假设我有一个函数:


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

    console.log(this);
}
function() {
    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有些误解,因为它在本例中的行为方式与我所期望的完全不同。

您需要传递上下文:

func(x.q.bind(x));
这是因为当您只传递
x.q
时,您传递的是函数:


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

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

代码不知道此所指的是什么。

您需要传递上下文:

func(x.q.bind(x));
这是因为当您只传递
x.q
时,您传递的是函数:


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

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

代码不知道这个指的是什么。

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

当您运行
x.q()
时,您是在
x
对象的“上下文”中运行
q()
,因此
这个
内部
q()
x


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

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

当您运行
x.q()
时,您是在
x
对象的“上下文”中运行
q()
,因此
这个
内部
q()
x

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

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

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

如果我调用如下函数:

obj.something.deep.property.func()

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

(注意:如果没有确定上下文,这是严格模式
这是
未定义的
,而不是
窗口

因为函数的上下文(
)是通过在JavaScript中调用它来设置的,而不是像其他一些语言一样声明的

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

如果我调用如下函数:

obj.something.deep.property.func()

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

(注意:如果未确定上下文,则为严格模式
未定义
,而非
窗口

读取的可能重复