从匿名函数调用mouseover函数时失去作用域



我正在研究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的值对任何给定的函数调用来说都可能是一个完全的惊喜。

最新更新