2010-01-27 53 views
24

使用JavaScript的令人困惑的事情一个工作用帮助,“这”是混淆了我在JavaScript

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

时,但有多个对象,尤其是this变化,并成为活动方面打交道时,混乱以追踪/理解。

因此,如果任何人有更好的输入/准则/思念/更好的做法,请分享。另外我想知道如果使用this给予任何(性能)​​优势或什么?

+8

这不仅仅是你 - 这是该语言更令人困惑的方面之一。你应该得到一些很好的答案;我期待着他们的阅读。 – 2010-01-27 16:20:35

回答

27

这不是性能,它是关于访问对象的特定实例的属性: -

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浏览器的内存泄漏的变通。

+0

我认为这应该是x.init()不是e.init(),但编辑<6个字符,所以我不能提交它。 – 2014-10-27 18:24:26

6

这是非常混乱。这取决于你如何调用函数。 Doug Crockford在他的书Javascript, the Good Parts中写了一篇很好的文章。它的要点是在this excellent answer否则严重制定的问题。

不,不是关于性能。

2

this关键字良好的和启发性的文章是this(没有双关语意)。这篇文章可能会为你清理一些东西,我知道它适合我。

的基本规则是,一个函数内部this关键字总是指函数的所有者,并且在功能简称当他们复制关键,理解的后果是理解。例子见前面提到的文章。

1

使用

var me = this; 

function(){ 

之外,那么你可以参考我()的函数

3

对我来说,它帮助了很多下列指南中:每一次你看this认为owner。拥有该功能所分配变量名的对象将成为this。如果你不知道谁拥有它,那么this将成为窗口。