我正在研究jQuery ToolTip插件(以下简称ToolTip)的代码,发现了一个我不完全理解的行为。
Tooltip绑定鼠标悬停函数,如下所示:
.mouseover(save)
以这种方式调用时,this
变量为HtmlDivElement
。
我尝试将mouseover
更改为:
.mouseover(function(e){save(event)})
因为我在找鼠标事件。但是,现在this
变量是Window
。
我找到了一种方法,通过使用以下代码行来baypass并获得HtmlDivElement
:
.mouseover(function(e){save(this, event)})
并且使用CCD_ 7作为函数内部的CCD_。
我的问题是,为什么save
函数在mouseover绑定内的匿名函数内被调用时会失去其作用域?
this
的值是在每次函数调用时建立的。当您的匿名函数调用"save"函数时,它不会做任何事情来确定this
应该是什么,所以它是默认值:全局对象("window")。
你可以这样做:
.mouseover(function(e){ save.call(this, e); })
使this
具有您需要的价值。处理程序中的this
值将由框架安排,因此使用.call()
将其传递给"save"函数。
重复一遍:在JavaScript中,this
并不是由代码的静态结构决定的。相反,它取决于每个单独函数调用的情况。这意味着,对于任何函数,无论它是如何声明的,this
的值对任何给定的函数调用来说都可能是一个完全的惊喜。