【问题标题】:mouseover function losing scope when called from anonymous function从匿名函数调用时,mouseover 函数失去作用域
【发布时间】:2012-08-20 14:02:33
【问题描述】:

我正在研究 jQuery ToolTip 插件(以下简称 Tooltip)的代码,并注意到一个我不完全理解的行为。

Tooltip 像这样绑定鼠标悬停功能:

.mouseover(save)

这样调用时,this变量为HtmlDivElement

我尝试将mouseover 更改为:

.mouseover(function(e){save(event)})

因为我正在寻找 MouseEvent。但是,现在this 变量是Window

我找到了一种方法来绕过这个并使用这行代码获取HtmlDivElement

.mouseover(function(e){save(this, event)})

并使用this 替换函数内的this

我的问题是 - 为什么save 函数在鼠标悬停绑定内的匿名函数内被调用时会失去其作用域?

【问题讨论】:

    标签: javascript jquery jquery-plugins tooltip


    【解决方案1】:

    this 的值是在每次函数调用时建立的。当您的匿名函数调用该“保存”函数时,它不会做任何事情来确定 this 应该是什么,因此它是默认值:全局对象(“窗口”)。

    你可以这样做:

    .mouseover(function(e){ save.call(this, e); })
    

    使this 具有您需要的价值。处理程序中的 this 值将由框架安排,因此通过使用 .call() 您将其传递给“保存”函数。

    重复一遍:在 JavaScript 中,this 不是由代码的静态结构决定的。相反,它取决于每个单独的函数调用的情况。这意味着对于任何函数,无论它是如何声明的,this 的值在任何给定的函数调用中都可能完全出乎意料。

    【讨论】:

    • 谢谢,这真的帮助我更好地理解了.call(),我在任何地方都看到了。
    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2017-08-13
    • 2011-09-10
    • 2011-12-15
    • 2011-06-22
    • 2011-12-11
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多