2016-03-05 64 views
2

我最近看到一个监听器在对象的方法里面定义了什么都没有。很好的例子是这样的在对象内部定义的事件监听器

var obj={ 
    shout:function(){ 
     onclick = function(){ 
      alert("hi"); 
     } 
    } 
} 
obj.shout() 

这个工程就像window.onclick = shout;

也当我们重新定义这样

var obj={ 
    shout:function(s){ 
     onclick = function(s){ 
      alert(s); 
     } 
    } 
} 
obj.shout('hi') 

它输出[对象鼠标事件]功能

它是怎样到达全自动绑定到窗口对象?这应该指向obj对象,如果onclick被绑定到this呼吁这是指obj(我的怀疑)它是如何与窗口对象一起工作?

+1

您可能认为全局变量(这里是“obj”和“onclick”)实际上是全局“窗口”对象(在浏览器中)的属性。也就是说,'var obj = foo;'实际上是'window [obj] = foo;'aka'window.obj = foo;' –

+0

Err。 'window [“obj”] = foo;'就是。 (编辑以前的评论太迟了)。 –

回答

3

它是怎样到达全自动绑定到窗口对象?

因为onclickwindow的属性,以及window所有属性都是全局变量。由于您尚未在任何地方声明onclick变量,因此onclick = function...行将分配给全局。

3

它是如何自动绑定到窗口对象的?

因为每当您声明变量而不使用var关键字,它将被分配到window object。因此,在我们的情况下,您已指定functiononclick,而未指定var,因此该功能被分配为window.onclick

,如果你想使用通过constructor函数传递的值,那么对于你需要写一个closure

var obj={ 
    shout:function(s){ 
     onclick = function(){ 
     //-----------------^ remove the parameter here, and it will become a closure. 
      alert(s); 
     } 
    } 
} 

obj.shout('hi'); 
+0

*“因为每当你声明一个变量而不使用'var'关键字时”*他们根本不*声明* onclick变量。他们*使用*它。 –

+0

@ T.J.Crowder是的,这条线是一条通用语句。但是后来我已经明确地解释了'onclick'。我接受,我没有完全读过这个问题。收到downvote后完全阅读。感谢您的发言。 :) –