代码之家  ›  专栏  ›  技术社区  ›  streetparade

在javascript中“with”做什么?

  •  19
  • streetparade  · 技术社区  · 14 年前

    我看到了以 with . 这有点让人困惑。它的作用是什么?如何正确使用它?

    with (sObj) return options[selectedIndex].value;
    
    8 回复  |  直到 12 年前
        1
  •  22
  •   Justin Niessner    14 年前

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

    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

        2
  •  10
  •   Sinan Ünür    14 年前

    这个 with 语句是纯语法的糖分,但它也会引起一些讨厌的错误。

    with Statement Considered Harmful 澄清:

    如果你不能阅读一个程序并确信你知道它将要做什么,你就不能确信它会正常工作。因此, 具有 应避免陈述。

        3
  •  2
  •   Fabian    14 年前

    在有块的情况下,您不必键入:

    sObj.options[selectedIndex].value
    

    但是你可以使用:

    options[selectedIndex].value
    
        4
  •  2
  •   Community Jaime Torres    7 年前

    它相当于

    return sObj.options[selectedIndex].value;
    

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

    这可以使代码有时更可读, 但是 它还可能导致歧义,因为变量引用既可以是SOBJ引用,也可以是全局引用。

    legitimate uses for javascript's "with" statement D

        5
  •  1
  •   Robusto    14 年前

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

    对于对象 SOBJ (这里大概是一个select元素),在这个元素上引用的所有子元素和属性(或者在大括号后面)都将其视为其父范围。

        6
  •  1
  •   belugabob    14 年前

    您的示例可以重写为…

    return sObj.options[selectedIndex].value;
    

    …因为“with”语句将所有相关语句放在所提供对象的范围内。在这种情况下,这是非常没有意义的,但是,如果你在“sobj”上做了很多操作,那么它可以节省很多输入。

    完全是虚构的例子。

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

    但是,尽管如此,通常情况下保存打字可以以更好的方式实现。

        7
  •  1
  •   Yacoby    14 年前

    它不是一个函数(如编辑前问题标题所示),而是一个语句。如果代码示例的格式如下,则可能更有意义:

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

    关于它的作用( Source )

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

    这意味着在代码示例中,首先检查 options 是的财产 sObj . 如果是这样 选项 sObj.options 否则,它将检查由名称定义的变量的其他作用域。 选项

    使用 with 声明是,仅仅通过浏览代码就不可能知道访问了什么。还有其他更好的选择,如所示 this article