【问题标题】:Javascript function implementationJavascript函数实现
【发布时间】:2013-11-09 06:34:58
【问题描述】:

我有这样的代码:

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

【问题讨论】:

  • 这个问题可能重复:stackoverflow.com/questions/8035822/…
  • 它将闭包的上下文显式绑定到父上下文。同(function(){ }).apply(this)
  • 请注意,我将“范围”定义为函数可以访问的变量(即,它自己的局部变量加上它嵌套在其中的任何函数的变量),这与函数无关处理this的值。
  • @nnnnnn 那么将 jQuery 对象(或者可能只是空对象)应用到它以提高性能不是更好的选择吗?如果这指向本地范围,它不会提高性能吗?由于窗口对象非常慢。在这里我不需要表演,但我只是好奇它是否是调用这个函数的好方法。

标签: javascript jquery


【解决方案1】:

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

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

如果您想为this 设置不同的值,则需要通过.call.apply 传递其他值。

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

【讨论】:

    【解决方案2】:

    “据我了解,这个函数将具有全局范围,不是吗?”

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

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

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

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

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

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

    ...然后在第二个点击处理程序中,你调用我认为是相同的函数没有使用this

    deleteKeyword($(this));
    

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

    var deleteKeyword = function(...
    

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

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

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

    【讨论】:

    • 我只是对此感到好奇。我只想利用好的做法。如果我声明 var that = {} 在“this”处为“that”进行更改(也在处理程序中附加)会更好吗?它是更清洁的解决方案吗?如果这些问题听起来很愚蠢,我很抱歉,但这对我来说很有趣。
    • var that = {} 听起来你只是过于复杂了。退后一步:你为什么认为你需要在那个函数中使用this
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2020-08-08
    相关资源
    最近更新 更多