javascript中的“with”关键字

时间:2009-12-18 23:06:13

标签: javascript

  

可能重复:
  Are there legitimate uses for JavaScript’s “with” statement?

我最近发现在javascript中,可以执行以下操作:

with document{
    write('foo');
    body.scrollTop = x;
}

这样做的缺点是需要检查每个变量以查看它是否属于文档对象,从而产生了巨大的开销。

或者,人们可以这样做:

var d = document;
d.write('foo');
d.body.scrollTop = x;

是否存在使用'with'关键字的合理情况?

4 个答案:

答案 0 :(得分:66)

不要使用它: http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

  

JavaScript的with语句旨在提供写入对象的重复访问的简写。所以不要写

ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing = true;
ooo.eee.oo.ah_ah.ting.tang.walla.walla.bang = true;
     

你可以写

with (ooo.eee.oo.ah_ah.ting.tang.walla.walla) {
    bing = true;
    bang = true;
}
     

看起来好多了。除了一件事。通过查看bingbang将被修改的代码,您无法判断。 ooo.eee.oo.ah_ah.ting.tang.walla.walla会被修改吗?或者全局变量bingbang会被破坏吗?不可能确切地知道......

     

如果您无法阅读某个程序并确信自己知道该怎么做,那么您就无法确信它能够正常运行。出于这个原因,应该避免使用with语句......

答案 1 :(得分:17)

答案 2 :(得分:14)

尽管几乎在所有地方都有相反的建议,但我认为有“使用”的用途。例如,我正在研究Javascript的域模型框架,它使用下划线字符,就像jQuery使用“$”一样。这意味着如果没有“with”,我会在代码中散布许多下划线,这些下划线会降低其可读性。这是使用框架的应用程序的随机行:

_.People().sort(_.score(_.isa(_.Parent)),'Surname','Forename');

而“with”则看起来像

with (_) {
    ...

    People().sort(score(isa(Parent)),'Surname','Forename');

    ...
}

真正有用的是“with”的只读版本。

答案 3 :(得分:5)

我会避免在生产代码中使用它,因为它含糊不清但是使用with模仿let绑定有for-loop-closure解决方案的替代解决方案,这里是我的副本上一个答案:

使用for循环内部函数的标准闭包解决方案的替代方法:

<a  href="#">blah</a><br>
<a  href="#">blah</a><br>
<a  href="#">foo</a><br>
<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
        for ( var i = anchors.length; i--; ) {
            var link = anchors[i];
            with ({ number: i }) {
                link.onclick = function() {
                    alert(number);
                };
            }
        }
    })();
</script>

归功于nlogax提供的解决方案我几乎被扯掉了: Javascript infamous Loop issue?

以下是标准解决方案:

<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
    for ( var i = anchors.length; i--; ) {
        var link = anchors[i];
        (function(i) {
            link.onclick = function() {
                alert(i)
            }
        })(i);
    }
    })();
</script>