使用JavaScript的令人困惑的事情一个工作用这帮助,“这”是混淆了我在JavaScript
var x = {
ele : 'test',
init : function(){
alert(this.ele);
}
}
时,但有多个对象,尤其是this
变化,并成为活动方面打交道时,混乱以追踪/理解。
因此,如果任何人有更好的输入/准则/思念/更好的做法,请分享。另外我想知道如果使用this
给予任何(性能)优势或什么?
使用JavaScript的令人困惑的事情一个工作用这帮助,“这”是混淆了我在JavaScript
var x = {
ele : 'test',
init : function(){
alert(this.ele);
}
}
时,但有多个对象,尤其是this
变化,并成为活动方面打交道时,混乱以追踪/理解。
因此,如果任何人有更好的输入/准则/思念/更好的做法,请分享。另外我想知道如果使用this
给予任何(性能)优势或什么?
这不是性能,它是关于访问对象的特定实例的属性: -
x.init()
如果你没有在函数中使用this
将不会显示在“测试”。
有效上面的行是相同的: -
x.init.call(x);
在使用call
在执行函数时被分配给this
第一paramater。
现在考虑: -
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'));
注意elem = null
是IE浏览器的内存泄漏的变通。
我认为这应该是x.init()不是e.init(),但编辑<6个字符,所以我不能提交它。 – 2014-10-27 18:24:26
这是非常混乱。这取决于你如何调用函数。 Doug Crockford在他的书Javascript, the Good Parts中写了一篇很好的文章。它的要点是在this excellent answer否则严重制定的问题。
不,不是关于性能。
在this
关键字良好的和启发性的文章是this(没有双关语意)。这篇文章可能会为你清理一些东西,我知道它适合我。
的基本规则是,一个函数内部this
关键字总是指函数的所有者,并且在功能简称当他们复制关键,理解的后果是理解。例子见前面提到的文章。
使用
var me = this;
的
function(){
之外,那么你可以参考我()的函数
对我来说,它帮助了很多下列指南中:每一次你看this
认为owner
。拥有该功能所分配变量名的对象将成为this
。如果你不知道谁拥有它,那么this
将成为窗口。
这不仅仅是你 - 这是该语言更令人困惑的方面之一。你应该得到一些很好的答案;我期待着他们的阅读。 – 2010-01-27 16:20:35