在 JavaScript 中使用“this”让我感到困惑

The use of "this" is confusing me in JavaScript

提问人:Anil Namde 提问时间:1/28/2010 最后编辑:Brian Tompsett - 汤莱恩Anil Namde 更新时间:9/12/2020 访问量:8826

问:

使用 JavaScript 令人困惑的事情之一是在使用this

var x = {  
  ele : 'test',
  init : function(){ 
    alert(this.ele);
  }
}

然而,当处理多个对象,尤其是事件时,上下文会发生变化,并且变得难以跟踪/理解。this

因此,如果有人有更好的意见/指南/想法/更好的做法,请分享。另外,我想知道使用是否具有任何(性能)优势还是什么?this

不显眼的 javascript

评论

8赞 Drew Wills 1/28/2010
这不仅仅是你 -- 这是语言中最令人困惑的方面之一。你应该得到一些好的答案;我很期待阅读它们。

答:

28赞 AnthonyWJones 1/28/2010 #1

这与性能无关,而是与访问对象的特定实例的属性有关:-

x.init()

如果您没有在函数中使用,则不会显示“测试”。this

实际上,上面的行与以下情况相同:

x.init.call(x);

使用 of 时的第一个参数被分配给函数的执行时间。callthis

现在考虑:-

var fn = x.init;  //Note no () so the function itself is assigned to the variable fn
fn();

现在,您在警报中一无所获。这是因为以上是有效的:-

fn.call(window);

在浏览器托管的 Javascript 中,对象是全局对象的同义词。当一个函数被调用为“原始”时,则默认为全局对象。windowthis

经典的错误是做这样的事情:-

var x = {
   ele: 'test';
   init: function(elem) { 
      elem.onclick = function() { alert(this.ele); }
   }
}
x.init(document.getElementById('myButton'));

但是,这不起作用,因为附加到 onclick 事件的函数是由浏览器使用如下代码调用的:-

onclick.call(theDOMElement)

因此,函数运行时并不是您想象的那样。this

对于这种情况,我通常的解决方案是:-

var x = {
   ele: 'test';
   init: function(elem) {
      var self = this; 
      elem.onclick = function() { alert(self.ele); }
      elem = null;
   }
}
x.init(document.getElementById('myButton'));

请注意,IE 内存泄漏解决方法。elem = null

评论

0赞 Moby Disk 10/28/2014
我认为这应该是 x.init() 而不是 e.init(),但编辑是 <6 个字符,所以我无法提交它。
6赞 Teun D 1/28/2010 #2

这是非常令人困惑的。这取决于您调用函数的方式。道格·克罗克福德(Doug Crockford)在他的著作《Javascript, the Good Parts》中写了一篇很好的文章。它的要点在于对一个本来表述不当的问题的出色回答

不,这与性能无关。

2赞 Håvard S 1/28/2010 #3

一篇关于关键字的好文章是这样的(没有双关语)。这篇文章可能会为你澄清问题,我知道它对我有用。this

基本规则是函数内部的关键字始终引用函数所有者,而理解后果的关键是了解何时引用函数以及何时复制函数。有关示例,请参阅前面提到的文章。this

2赞 acheo 1/28/2010 #4

var me = this;

function(){

然后你可以在 function() 中引用我

3赞 Stefano Borini 1/29/2010 #5

对我来说,它对以下准则有很大帮助:每次你看到时都想一想。拥有函数所分配到的变量名称的对象将成为 .如果你不能理解谁拥有它,那么将是窗口。thisownerthisthis