【问题标题】:var that = this, self = this, etcvar that = this、self = this 等
【发布时间】:2012-09-25 13:57:57
【问题描述】:

以这种方式分配变量的目的是在存在嵌套作用域时提供对父作用域内活动对象的访问。我认为这是相当糟糕的形式;为什么不为父目标对象提供一个更有意义的变量名?

例如,如果我们选择页面中的所有 div,然后遍历它们。在每个 div 中,我们选择目标 div 中的所有锚链接,在嵌套循环中迭代这些锚链接。在此示例中,外部范围的“this”是当前目标 div,内部范围的“this”将是当前目标锚链接。

要在外部范围内创建一个挂钩到活动目标 div,我通常会看到:

var that = this;

即使在 Crockford 的 Good-Parts 书中,他也使用了这个作业。

冒着因为质疑这种技术而出丑的风险,为什么不做一些更有意义的事情,比如

var outerDiv = this;

你怎么看?

【问题讨论】:

  • 这只是一个命名约定。每次我看到selfthat 的东西时,我往往会知道它的含义,而如果我看到outerDiv,我就必须搜索它是否是一个局部变量。
  • @sachleen:你的意思是,“你可以做到 this...” :)
  • 重点是不要获取外部对象的范围。它是在“this”已经退出时捕获当前对象的范围以供以后使用。故事是这样的:您加载页面,对象运行并完成。它表示当用户单击某个按钮时,会调用该对象的函数。但是您不能再使用“this”,因为该函数稍后运行,在原始对象已经完成之后。它的“这个”是窗口什么的。因此,我们使用 get a "that" 或 "self" 或 "me" 作为对首先创建稍后运行函数的对象的引用。希望对您有所帮助。

标签: javascript scope nested this


【解决方案1】:

这很好,但是您谈论 this 是迭代变量的方式听起来就像您在使用 jQuery。它并不总是一个元素,有时that 最有意义:

function Constructor() {
    var that = this;

    this.eventListenerThatWillBeBound = function() {
        // Do something with that
    };
}

所以...在这种情况下使用最清楚的东西。

【讨论】:

    【解决方案2】:

    我认为你应该以对你有意义的方式命名变量。

    人们使用约定是因为他们可以立即将其识别为代表一个常见场景,其他阅读代码的人也可以。

    如果您不喜欢传统的做事方式,请按照自己的方式做,但要确保您的变量对阅读您的代码的其他人有意义。


    FWIW,self 是对浏览器中全局上下文的引用,因此对于某些人来说,通过 self = thisself 变量与最近的外部上下文隐藏起来是有意义的。

    【讨论】:

      【解决方案3】:

      我大多是这样的

      function() {
        // use 'this' as it is 
      }.bind(this)
      

      或者我从外部调用具有范围的闭包

      closure.call(this); // the scope inside the closure is now 'this' too
      

      那我就不需要有趣的名字了。

      【讨论】:

        猜你喜欢
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 2012-06-05
        • 2012-09-04
        • 1970-01-01
        • 2011-07-18
        相关资源
        最近更新 更多