Javascript 在对象内部定义的事件侦听器

Javascript 在对象内部定义的事件侦听器,javascript,Javascript,我最近看到一个监听器在对象的方法中定义,绑定为nothing。这就是一个很好的例子 var obj={ shout:function(){ onclick = function(){ alert("hi"); } } } obj.shout() 这就像window.onclick=shout 当我们重新定义这样的函数时 var obj={ shout:function(s){ onclick = f

我最近看到一个监听器在对象的方法中定义,绑定为nothing。这就是一个很好的例子

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
aka
window.obj=foo错误<代码>窗口[“obj”]=foo就是这样。(编辑之前的注释为时已晚)。“因为每当您在不使用
var
关键字的情况下声明变量时”,他们根本就没有声明
onclick
变量。他们在用它。@T.J.Crowder是的,这句话是一般性的陈述。但是后来我已经为
onclick
明确地解释了它。我承认,我没有完全阅读这个问题。收到否决票后,请仔细阅读。谢谢你的直言不讳。:)