可能重复:
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'关键字的合理情况?
答案 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; }
看起来好多了。除了一件事。通过查看
bing
和bang
将被修改的代码,您无法判断。ooo.eee.oo.ah_ah.ting.tang.walla.walla
会被修改吗?或者全局变量bing
和bang
会被破坏吗?不可能确切地知道......如果您无法阅读某个程序并确信自己知道该怎么做,那么您就无法确信它能够正常运行。出于这个原因,应该避免使用
with
语句......
答案 1 :(得分:17)
以下是一些支持with关键字的博文。但请阅读azazul发布的YUI博客文章!
http://webreflection.blogspot.com/2009/12/with-worlds-most-misunderstood.html http://webreflection.blogspot.com/2009/12/with-some-good-example.html
答案 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>