【发布时间】:2013-06-21 23:33:42
【问题描述】:
我能找到的几乎所有记录 with 的资源都警告不要使用它,主要是因为如果未定义变量,它可能会产生不可预知的影响。
我想了解它,以便有效地利用它——毕竟,它的存在是有原因的。即使eval 也有它的非邪恶用途!
因此,考虑到这一点,假设我想从一个元素中删除所有子节点,而不使用 elem.innerHTML = "";
以下是否安全?
with(elem) while(firstChild) removeChild(firstChild);
请注意,此时我关心的不是可读性,而是功能。由于firstChild 是所有元素节点的属性,removeChild 是所有元素节点的方法,所以这样使用with 应该没问题,对吧?
同样,假设我想设置一些样式。
with(elem.style) {
color = "red";
backgroundColor = "black";
fontWeight = "bold";
}
由于所有这些都是样式对象的属性(即使没有在样式表中定义,它们也是空字符串),这样使用with 就可以了,对吧?
我是否遗漏了什么,或者是不断警告不要使用 with 类似于针对 PHP 的 mysql 扩展的警告:防止愚蠢的程序员?
【问题讨论】:
-
我投票支持防止滥用
-
请记住,使用
with语句会在严格模式下引发错误。所以我想说它可能不仅仅是“保护”(但现在不能说什么,规范在这一点上并不具体)。 -
我认为
with的主要危险是变量暴露在整个范围内,但我已经看到了使用 IIFE 的解决方法。显然,当您可以将查找缓存在变量中并使用它时,它 非常 慢吗?但我认为这种危险可能是一种优势。 -
eval有它的非邪恶用途吗?我能想到一个不再适用的方法:评估 JSON 字符串,但感谢JSON.parse,我们不必这样做。
标签: javascript