提问人:Anil Namde 提问时间:1/28/2010 最后编辑:Brian Tompsett - 汤莱恩Anil Namde 更新时间:9/12/2020 访问量:8826
在 JavaScript 中使用“this”让我感到困惑
The use of "this" is confusing me in JavaScript
问:
使用 JavaScript 令人困惑的事情之一是在使用this
var x = {
ele : 'test',
init : function(){
alert(this.ele);
}
}
然而,当处理多个对象,尤其是事件时,上下文会发生变化,并且变得难以跟踪/理解。this
因此,如果有人有更好的意见/指南/想法/更好的做法,请分享。另外,我想知道使用是否具有任何(性能)优势还是什么?this
答:
这与性能无关,而是与访问对象的特定实例的属性有关:-
x.init()
如果您没有在函数中使用,则不会显示“测试”。this
实际上,上面的行与以下情况相同:
x.init.call(x);
使用 of 时的第一个参数被分配给函数的执行时间。call
this
现在考虑:-
var fn = x.init; //Note no () so the function itself is assigned to the variable fn
fn();
现在,您在警报中一无所获。这是因为以上是有效的:-
fn.call(window);
在浏览器托管的 Javascript 中,对象是全局对象的同义词。当一个函数被调用为“原始”时,则默认为全局对象。window
this
经典的错误是做这样的事情:-
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
评论
这是非常令人困惑的。这取决于您调用函数的方式。道格·克罗克福德(Doug Crockford)在他的著作《Javascript, the Good Parts》中写了一篇很好的文章。它的要点在于对一个本来表述不当的问题的出色回答。
不,这与性能无关。
一篇关于关键字的好文章是这样的(没有双关语)。这篇文章可能会为你澄清问题,我知道它对我有用。this
基本规则是函数内部的关键字始终引用函数所有者,而理解后果的关键是了解何时引用函数以及何时复制函数。有关示例,请参阅前面提到的文章。this
用
var me = this;
在
function(){
然后你可以在 function() 中引用我
对我来说,它对以下准则有很大帮助:每次你看到时都想一想。拥有函数所分配到的变量名称的对象将成为 .如果你不能理解谁拥有它,那么将是窗口。this
owner
this
this
评论