Javascript`this`object==`window`在成员函数中
在我的一些Javascript对象中,我发现我的Javascript`this`object==`window`在成员函数中,javascript,Javascript,在我的一些Javascript对象中,我发现我的这个指针在创建时是正确的-这些是new Func()-类型的对象,但是在指定的方法中它可能是错误的 function Confused() { console.log("checking",this==window,"is always false"); this.method = function() { console.log("checking",this==window,"is true for some func
这个
指针在创建时是正确的-这些是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 fuzzle()).method()的调用中,它似乎丢失了这个指针。这种情况发生的时间似乎取决于函数,而不是随机的;在代码中,我是如何创建导致这种情况的类的
例如,在上联机,成员回调在有时调用时有一个错误的this
指针
为什么,以及如何修复它?该关键字引用调用上下文。它从来没有错过,但它可能不是你所期望的那样
调用函数时,如果使用.call
或或
调用函数,则可以手动设置上下文
此外,如果您想要引用窗口
,为什么不使用窗口
而不是此
?这是一种更可靠的访问窗口对象的方法。除了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");
};
};
问题在于,真正调用函数的人可以控制函数的上下文。如果您不能控制函数调用(也就是说,如果您不能修改代码),那么您就只能使用我给出的解决方案(至少我知道没有其他方法)
虽然这个解决方案看起来有点“黑客”,但如果你仔细想想,它确实不是。它简单地利用了闭包赋予您的功能:D在Javascript中使用函数有4种方法
其中每一项都会改变此
的内容:
- 函数调用:this=全局对象(浏览器中的窗口)
- 方法调用:this=从中调用它的对象李>
- 构造函数调用:this=您正在创建的新对象李>
- 调用/应用调用:this=您传递的对象
在您的情况下,this==window
当您直接调用函数(fuzzed()
)时,但如果您使用new(new fuzzed()
)调用,则它将是您正在创建的新对象。是否回答了您的问题?this
的值由每次调用函数的特定情况决定。函数最初被定义为某个对象的属性值并不重要,这一点都不重要。重要的是函数的调用方式,这就是我的代码链接中的解决方法。我对此很不满意。这是我明白的答案。我的代码将该方法作为回调传递给另一个函数。我真的不喜欢学习Javascript;它似乎在每一个转弯处都有这样奇怪的、毫无意义的陷阱。哦,好吧。