“据我了解,此功能将具有全局范围,不是吗?”
“作用域”是关于一个函数可以访问哪些变量(即,它自己的局部变量,加上在可能嵌套在其中的任何函数中声明的局部变量,以及全局变量),这与this
. 范围取决于函数声明的位置,但this
取决于函数的调用方式。
“因为 .call(this)
正在将 window
对象传递给这个闭包”
我们不能仅从显示的代码中看出这一点。大概您的意思是该代码块没有嵌套在其他函数中,所以是的,this
将是window
. 但是,如果该代码曾经粘贴在某个其他函数中,那么它this
可能具有其他值,具体取决于该其他函数的调用方式。
“改变 .call(this)
只是 ()
改变什么吗?”
如果你只使用()
那将意味着函数内部this
将是window
. 这是否会改变任何东西取决于this
in.call(this)
是否window
首先存在 - 正如我上面已经提到的,如果该块嵌套在其他一些函数this
中可能是别的东西。话虽如此,对于显示的代码,如果this
不是window
我认为您的代码会中断的任何内容。因为你声明了一个这样的函数:
this.deleteKeyword = function(model) {...}
...然后在第二个单击处理程序中,您调用我认为是相同的功能而不使用this
:
deleteKeyword($(this));
唯一可行的方法是 if this
iswindow
并且deleteKeyword()
函数因此是全局的。如果this
是任何其他对象,则该函数将是该其他对象的属性,因此不能直接作为deleteKeyword()
. 但是,除非您特别希望deleteKeyword()
可以从未显示的其他代码访问,否则根本没有理由将其创建为属性this
。只需声明它var
:
var deleteKeyword = function(...
...然后它将只能在该函数内部以及嵌套在其中的函数内部访问,例如您的单击处理程序。并且.call()
函数末尾的 . 将是多余的,因为该函数实际上不会使用this
.
“那么将 jQuery 对象(或者可能只是空对象)应用到它以提高性能不是更好的选择吗?如果它指向本地范围,它不会提高性能吗?因为 window 对象非常慢。”
正如我已经说过的,“范围”和价值this
是不相关的概念。我不确定您为什么担心该代码的性能。但是,如果您要应用 jQuery 或空对象,.call(jQuery)
否则.call({})
代码将无法按上述说明工作。