我正在使用新的,这个和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的东西,因为它在这种情况下的表现方式与我的预期完全不同。
答案 0 :(得分:4)
因为函数的上下文(this
)是由如何在JavaScript中调用而不是设置的,就像其他语言一样。< / p>
因此,当您调用类似f()
的函数时,没有上下文,因此它默认为window
但是当您像x.q()
一样调用它时,上下文是x
实例。
如果我调用了一个函数:
obj.something.deep.property.func();
在这种情况下,函数的上下文(this
)将是property
的任何内容。
(注意:如果没有确定上下文,那就是严格模式this
是undefined
,而不是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
指的是什么。