【问题标题】:JavaScript closures inside objects: what alias should have "this" for passing into anonymous function?对象内部的 JavaScript 闭包:什么别名应该有“this”来传递给匿名函数?
【发布时间】:2011-03-08 06:13:36
【问题描述】:

我们正在与我们的团队讨论下一步: 什么正确的名称应该有变量,它将是匿名函数中“this”的别名。简单例子:

var SomeConstructor = function() {

    this.someProperty = 'bingo';

    this.someMethod = function() {

        var myObjectAlias = this;

        $('a').click(function() {
            alert( myObjectAlias.someProperty );                  
        });

    }
}

所以我的问题是 - 什么正确的名称应该有变量“myObjectAlias”?或者你的代码中使用了什么?

【问题讨论】:

标签: javascript oop closures


【解决方案1】:

切线:考虑为您的构造函数使用原型:

var SomeConstructor = function() {}
SomeConstructor.prototype = {

    someProperty: 'bingo',

    someMethod: function() {   
        var self = this;    
        $('a').click(function() {
            alert( self.someProperty );                  
        });    
    }
}

someProperty 和 someMethod 属性可以在所有实例之间共享,因此它们可以正常工作。每当您需要为每个实例提供单独的值时,都应该将它们放在构造函数本身中。

【讨论】:

  • 感谢您的评论!我知道原型,但我的问题与此无关。从您的示例中,我看到您选择的别名是“self”。
【解决方案2】:

出于 Nick Craver 所述的原因,我更喜欢使用 self。

【讨论】:

    【解决方案3】:

    我认为有时使用有意义的名称会很好,例如“表单”或“容器”或其他任何名称。简而言之,一小段代码没什么大不了的,但在复杂的表单或对话框初始化中,往往会出现几个不同的“有趣”对象。

    【讨论】:

      【解决方案4】:

      在这些情况下,我倾向于使用self,或者明确地使用_self,具有this 的含义,没有冲突,保持简单直观,至少对我而言.

      例如:

      self.property
      self.doSomething()
      if(self.hasPickles) {
        self.eat();
      }
      

      当然,这完全是一个偏好问题,但是 大多数 与我交谈过的 JS 开发人员发现这种命名风格非常直观,这并不是说大多数人都这样做,但事实并非如此没关系吗?做对你的团队有用的事情 :)

      【讨论】:

        【解决方案5】:

        您会在代码示例中看到很多。

        var that = this;
        
        $('a').click(function() {
                 alert( that.someProperty );                  
        });
        

        要做到这一点;真的没关系,随心所欲。

        【讨论】:

          猜你喜欢
          • 2014-03-05
          • 2015-05-09
          • 2015-01-09
          • 1970-01-01
          • 1970-01-01
          • 2018-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多