我有这样的代码:
(function() {
$(document).ready(function() {
//event handlers
$('.project-delete').on('click', function() {
deleteProject($(this));
});
$('.keyword-delete').on('click', function() {
deleteKeyword($(this));
});
this.deleteKeyword = function(model) {
}
}).call(this);
我很好奇,如果这是一个很好的方法,因为我最近学习JS,据我所知,这个函数将具有全局范围,不是吗?既然.call(this)
将窗口对象传递给此闭包,那么我认为它不是最佳选择?有什么我想念的吗?将.call(this)
改为仅()
会改变什么吗?
编辑:那么将窗口对象传递给该闭包是否可以?传递一个空对象或jQuery对象不是更好吗?
答案 0 :(得分:1)
假设此函数在全局范围内定义,deleteKeyword
函数也将具有全局范围,因为在父函数的上下文中this
基本上是window
(已经从外部传递为this
;在全局范围this === window
)。
如果您将.call(this)
更改为()
,则this
仍然是window
。这是因为当您通过简单的函数调用调用函数时,this
将设置为全局对象,即window
。
如果您想要this
的其他值,则需要通过.call
或.apply
传递其他内容。
有关this
行为的详细信息,请查看here。
答案 1 :(得分:1)
“据我所知,此功能将具有全局范围,不是吗?”
“范围”是关于函数可以访问的变量(即,它自己的局部变量,加上可能嵌套在其中的任何函数中声明的局部变量,加上全局变量),并且与值无关this
。范围取决于函数声明的位置,但this
取决于函数的调用方式。
“因为
.call(this)
正在将window
对象传递给此闭包”
我们无法从显示的代码中分辨出来。大概你的意思是那个代码块没有嵌套在其他函数中,所以是的,this
将是window
。但是,如果该代码被粘贴到其他函数中,则this
可能具有其他值,具体取决于调用其他函数的方式。
“将
.call(this)
更改为()
是否会改变任何内容?”
如果仅使用()
,则意味着函数this
内部将window
。这是否会发生变化取决于this
中的.call(this)
是否window
- 如上所述,如果该块嵌套在其他函数this
中可能是别的东西。话虽如此,对于显示的代码如果this
不是window
,我认为您的代码会中断。因为您声明了这样的函数:
this.deleteKeyword = function(model) {...}
...然后在第二个单击处理程序内部,您调用的内容是与使用this
的相同的函数:
deleteKeyword($(this));
唯一可行的方法是this
为window
且deleteKeyword()
函数是全局的。如果this
是任何其他对象,则该函数将是该另一个对象的属性,因此无法直接作为deleteKeyword()
访问。但除非您特别希望deleteKeyword()
可以从未显示的其他代码访问,否则没有理由将其创建为this
的属性。只需使用var
声明它:
var deleteKeyword = function(...
...然后它只能在该函数内部以及嵌套在其中的函数(例如您的单击处理程序)中访问。函数末尾的.call()
将是多余的,因为函数实际上不会使用this
。
“所以将jQuery对象(或者可能只是空对象)应用于它以提高性能是不是更好的选择?如果这会指向本地范围,它会不会提高性能?因为窗口对象是很慢。“
正如我已经说过的那样,“范围”和this
的值是不相关的概念。我不确定你为什么担心该代码的性能。但是如果您要使用.call(jQuery)
或.call({})
来应用jQuery或空对象,则代码将无法正常工作。