【问题标题】:What does "with" do in JavaScript?JavaScript 中的“with”有什么作用?
【发布时间】:2010-03-29 13:53:21
【问题描述】:

我看到了以 with 开头的 JavaScript 代码。这有点令人困惑。它有什么作用,如何正确使用?

with (sObj) return options[selectedIndex].value;

【问题讨论】:

    标签: javascript with-statement


    【解决方案1】:

    它增加了包含在块中的语句的范围:

    return sObj.options[selectedIndex].value;
    

    可以变成:

    with (sObj)
        return options[selectedIndex].value;
    

    在你的情况下,它并没有做很多事情......但请考虑以下几点:

    var a, x, y;
    var r = 10;
    a = Math.PI * r * r;
    x = r * Math.cos(PI);
    y = r * Math.sin(PI /2);
    

    变成:

    var a, x, y;
    var r = 10;
    with (Math) {
      a = PI * r * r;
      x = r * cos(PI);
      y = r * sin(PI / 2);
    }
    

    ...节省了几次击键。 Mozilla 文档实际上在更详细地解释事物方面做得很好(以及使用它的利弊):

    with - Mozilla Developer Center

    【讨论】:

    • 蹩脚的用法,就像在 VBA 中一样。在 Python 中,with 可以负责清理一次性对象。在 C# 中,它被称为 using。
    • @Mark - 谢谢。看起来我应该包含“建议不要使用这个”子句。
    • +1 感谢贾斯汀回答问题。很容易成为 PC 并说不要使用它 - 但如果我们努力了解并为自己尝试功能,我们可以做出明智的决定
    【解决方案2】:

    with 语句是纯粹的语法糖,但它也可能导致一些讨厌的错误。

    请参阅with Statement Considered Harmful 了解详情:

    如果您无法阅读程序并确信您知道它会做什么,那么您就无法确信它会正常工作。因此,应避免使用with 语句。

    【讨论】:

    • ++ 提到'with'的缺点
    【解决方案3】:

    在 with 块中你不必输入:

    sObj.options[selectedIndex].value
    

    但你可以使用:

    options[selectedIndex].value
    

    【讨论】:

      【解决方案4】:

      相当于

      return sObj.options[selectedIndex].value;
      

      With 允许您在特定对象的上下文中发出语句块。因此,with 块中的所有语句都被视为括号中对象的成员。

      这有时可以使代码更具可读性,它也可能导致歧义,因为变量引用可以使用 sObj 或全局。

      legitimate uses for javascript's "with" statement :D

      【讨论】:

        【解决方案5】:

        由于性能问题,我建议不要使用它,但上面的意思是:

        对于对象 sObj(这里可能是一个 select 元素),在这个对象(或后面的花括号之间)引用的所有子对象和属性都将其视为其父范围。

        【讨论】:

          【解决方案6】:

          您的示例可以重写为...

          return sObj.options[selectedIndex].value;
          

          ...因为'with'语句将所有相关语句放在提供的对象的范围内。在这种情况下,这是毫无意义的,但是,如果您对 'sObj' 进行大量操作,则可以节省大量输入。

          完全虚构的例子..

          with (sObj) 
          {
             if(options[selectedIndex].value < 10){
                 options[selectedIndex].value++;
                 total+ = options[selectedIndex].value;
             }
          }
          

          但是,话虽如此,通常情况下可以通过更好的方式来节省打字。

          【讨论】:

            【解决方案7】:

            它不是一个函数(正如在编辑之前的问题标题中所指出的那样),而是一个语句。如果代码示例的格式如下:

            with (sObj){
                return options[selectedIndex].value;
            }
            

            关于它的作用 (Source)

            with 语句为一组语句建立默认对象。 JavaScript 在语句集中查找任何不合格的名称,以确定这些名称是否是默认对象的属性。如果非限定名称与属性匹配,则在语句中使用该属性;否则,使用局部或全局变量。

            这意味着在代码示例中,首先检查options 是否为sObj 的属性。如果是则options 引用sObj.options,否则检查其他范围以查找由名称options 定义的变量

            使用with 语句的缺点是,仅仅看一眼代码就不可能知道访问了什么。如this article所示,还有其他更好的选择

            【讨论】:

            • 虽然您的其余答案是正确的,但格式与它的关系相对较小。
            • @belugabob 请阅读答案,而不是猜测其内容。我从来没有提到与with 语句有任何关系的格式。我说过如果使用大括号格式化它会更有意义,因为它看起来不像函数调用而更像是语句。
            • @belugabob 我还重新排列了词序,使其更难被误解。
            • 是的 - 现在更有意义了。
            【解决方案8】:
            猜你喜欢
            • 2017-11-21
            • 1970-01-01
            • 2016-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-01
            • 1970-01-01
            相关资源
            最近更新 更多