Javascript函数实现

时间:2013-11-08 22:00:32

标签: javascript jquery

我有这样的代码:

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

2 个答案:

答案 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));

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

var deleteKeyword = function(...

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

  

“所以将jQuery对象(或者可能只是空对象)应用于它以提高性能是不是更好的选择?如果这会指向本地范围,它会不会提高性能?因为窗口对象是很慢。“

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