Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript`this`object==`window`在成员函数中_Javascript - Fatal编程技术网

Javascript`this`object==`window`在成员函数中

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

在我的一些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 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;它似乎在每一个转弯处都有这样奇怪的、毫无意义的陷阱。哦,好吧。