从匿名函数调用时,鼠标悬停功能丧失范围(mouseover function losing scop

2019-10-17 03:59发布

我在寻找到jQuery的工具提示插件(以下提示)的代码,并有注意到我的行为不完全了解。

提示结合像这样鼠标悬停功能:

.mouseover(save)

当以这种方式调用, this变量是HtmlDivElement

我试图改变mouseover到这一点:

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

因为我在寻找的MouseEvent。 不过,现在this变量是Window

我发现了一种baypass这并获得HtmlDivElement通过使用此行代码:

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

并使用this作为一个replacment this里面的功能。

我的问题是-为什么是save功能丧失它的范围被称为鼠标悬停结合内部的匿名函数里面是什么时候?

Answer 1:

this是在每个函数调用建立。 当你的匿名函数调用“保存”功能,它没有做任何事情,以确定哪些this是应该的,所以它的默认值:全局对象(“窗口”)。

你可以这样做:

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

使this拿上你所需要的价值。 在this的句柄值将由框架使用安排,所以.call()你将它传递到“保存”功能。

重复:在JavaScript中, this不是由代码的静态结构决定的。 相反,它依赖于每个单独的函数调用的情况。 这意味着,对于任何功能,无论它是如何宣布,价值this可能是在任何给定函数调用完全是个意外。



文章来源: mouseover function losing scope when called from anonymous function