[英]Javascript `this` object == `window` in member function
在我的一些Javascript对象中,我发现我的this
指针是正确的 - 这些是new Func()
类型对象 - 在创建时,但在指定的方法中它可能是错误的。
function Confused() {
console.log("checking",this==window,"is always false");
this.method = function() {
console.log("checking",this==window,"is true for some funcs but not others");
};
};
在某些调用(new Confused()).method()
-它似乎已经失去了它的this
指针。 这种情况发生的时间似乎取决于功能,而不是随机的; 它在代码中的一些东西,我是如何创建导致这种情况的类。
一个例子是在网上http://williame.github.com/barebones.js/和成员回调G3D._file_loaded
有错this
指针有时也被称为时。
为什么,我该如何解决?
有4种方法在JavaScript中使用的函数每个这些确实是什么改变了什么内容this
就是:
在你的情况下, this == window
直接调用函数( Confused()
),但如果你使用new( new Confused()
)调用,那么它将是你正在创建的新对象。
this
关键字引用调用上下文。 它永远不会错,但它可能不是你所期望的那样。
调用函数时,您可以手动设置背景下,如果你把它.call
或.apply
。
此外,如果您想要window
的引用,为什么不使用window
而不是this
? 这是一种更可靠的访问窗口对象的方法。
除了David Hedlunds的解释,你可以“解决”这个问题:
function Confused() {
var that = this;
console.log("checking",that==window,"is always false");
this.method = function() {
console.log("checking",that==window,"is always false");
};
};
问题在于,实际调用函数的人可以控制函数的上下文。 如果你不控制函数调用(也就是说,如果你不能修改代码),那么你会坚持使用我给出的解决方案(至少我不知道其他方式)。
虽然解决方案看起来有点“hackish”,但如果你想一想,它真的不是。 它只是利用闭包给你的力量:D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.