0

我有这样的代码:

(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 对象不是更好吗?

4

2 回答 2

1

“据我了解,此功能将具有全局范围,不是吗?”

“作用域”是关于一个函数可以访问哪些变量(即,它自己的局部变量,加上在可能嵌套在其中的任何函数中声明的局部变量,以及全局变量),这与this. 范围取决于函数声明的位置,但this取决于函数的调用方式。

“因为 .call(this) 正在将 window 对象传递给这个闭包”

我们不能仅从显示的代码中看出这一点。大概您的意思是该代码块没有嵌套在其他函数中,所以是的,this将是window. 但是,如果该代码曾经粘贴在某个其他函数中,那么它this可能具有其他值,具体取决于该其他函数的调用方式。

“改变 .call(this) 只是 () 改变什么吗?”

如果你只使用()那将意味着函数内部this将是window. 这是否会改变任何东西取决于thisin.call(this)是否window首先存在 - 正如我上面已经提到的,如果该块嵌套在其他一些函数this中可能是别的东西。话虽如此,对于显示的代码,如果this不是window我认为您的代码会中断的任何内容。因为你声明了一个这样的函数:

this.deleteKeyword = function(model) {...}

...然后在第二个单击处理程序中,您调用我认为是相同的功能而不使用this

deleteKeyword($(this));

唯一可行的方法是 if thisiswindow并且deleteKeyword()函数因此是全局的。如果this是任何其他对象,则该函数将是该其他对象的属性,因此不能直接作为deleteKeyword(). 但是,除非您特别希望deleteKeyword()可以从未显示的其他代码访问,否则根本没有理由将其创建为属性this。只需声明它var

var deleteKeyword = function(...

...然后它将只能在该函数内部以及嵌套在其中的函数内部访问,例如您的单击处理程序。并且.call()函数末尾的 . 将是多余的,因为该函数实际上不会使用this.

“那么将 jQuery 对象(或者可能只是空对象)应用到它以提高性能不是更好的选择吗?如果它指向本地范围,它不会提高性能吗?因为 window 对象非常慢。”

正如我已经说过的,“范围”和价值this是不相关的概念。我不确定您为什么担心该代码的性能。但是,如果您要应用 jQuery 或空对象,.call(jQuery)否则.call({})代码将无法按上述说明工作。

于 2013-11-08T22:34:58.597 回答
1

假设这个函数是在全局范围内定义的,那么该deleteKeyword函数也将具有全局范围,因为this在父函数的上下文中基本上是window(它已经this从外部传入;在全局范围内this === window)。

如果更改.call(this)为 just ()this则仍在window函数内部。这是因为当您通过简单的函数调用调用函数时,this将设置为全局对象,即window.

如果你想要一个不同的值,你需要通过orthis传入其他东西。.call.apply

有关 的行为的更多信息this,请查看此处

于 2013-11-08T22:06:45.070 回答