Javascript 在对象内部定义的事件侦听器
我最近看到一个监听器在对象的方法中定义,绑定为nothing。这就是一个很好的例子Javascript 在对象内部定义的事件侦听器,javascript,Javascript,我最近看到一个监听器在对象的方法中定义,绑定为nothing。这就是一个很好的例子 var obj={ shout:function(){ onclick = function(){ alert("hi"); } } } obj.shout() 这就像window.onclick=shout 当我们重新定义这样的函数时 var obj={ shout:function(s){ onclick = f
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绑定到shout的这个,它指的是obj
(我怀疑)它怎么会与window对象一起工作 它是如何自动绑定到窗口对象的
因为每当您在不使用var
关键字的情况下声明变量时,它将被分配给窗口对象
。因此,在我们的例子中,您将函数
分配给onclick
,而没有指定var
,因此函数被分配给window.onclick
如果要使用通过构造函数传递的值
函数,则需要编写一个闭包
var obj={
shout:function(s){
onclick = function(){
//-----------------^ remove the parameter here, and it will become a closure.
alert(s);
}
}
}
obj.shout('hi');
它是如何自动绑定到窗口对象的
因为onclick
是window
的属性,而window
的所有属性都是全局变量。由于您没有在任何地方声明onclick
变量,因此onclick=function…
行正在分配给全局变量。您可能认为的全局变量(这里的“obj”和“onclick”)实际上是全局“window”对象(在浏览器中)的属性。也就是说,var obj=foo代码>实际上是窗口[obj]=foo
akawindow.obj=foo代码>错误<代码>窗口[“obj”]=foo代码>就是这样。(编辑之前的注释为时已晚)。“因为每当您在不使用var
关键字的情况下声明变量时”,他们根本就没有声明onclick
变量。他们在用它。@T.J.Crowder是的,这句话是一般性的陈述。但是后来我已经为onclick
明确地解释了它。我承认,我没有完全阅读这个问题。收到否决票后,请仔细阅读。谢谢你的直言不讳。:)