在JavaScript中安全使用"with"

Nie*_*sol 10 javascript

几乎所有with我能找到的资源记录都警告不要使用它,主要是因为如果没有定义变量,它可能会产生不可预测的影响.

我想理解它,以便我可以有效地使用它 - 毕竟,它是有原因的.甚至eval有它的非邪恶用途!

因此,考虑到这一点,假设我想从元素中删除所有子节点,而不使用 elem.innerHTML = "";

以下是安全的吗?

with(elem) while(firstChild) removeChild(firstChild);
Run Code Online (Sandbox Code Playgroud)

请注意,此时我并不关心可读性,只关注功能.既然firstChildremoveChild所有元素节点的属性和方法,那么使用with这种方式应该没问题吧?

同样,假设我想设置一些样式.

with(elem.style) {
    color = "red";
    backgroundColor = "black";
    fontWeight = "bold";
}
Run Code Online (Sandbox Code Playgroud)

由于所有这些都是样式对象的属性(即使没有在样式表中定义,它们也是空字符串),这样使用with就可以了,对吧?

我是否遗漏了某些内容,或者是不断使用with类似于针对PHP mysql扩展的内容的警告:防止愚蠢的程序员?

Kei*_*ith 4

Javascript 中的关键字with有点让人回想起 90 年代末与 VBScript 竞争时的情况。它仍然存在,但如果您禁用它'use strict';认为几乎每个 Javascript 验证器都存在错误,则它会被禁用。

它有两个主要问题,都与 JavaScript 中作用域的工作方式有关:

var color = "green";
var foo = "bar";

with(elem.style) {
    color = "red";
    foo = "something else";
}
Run Code Online (Sandbox Code Playgroud)

color现在做什么?什么是foo?这不仅是令人困惑的代码,而且由于 Javascript 在作用域中查找变量的方式,with它也是非常慢的代码,因为现在每个语句都有一个额外的作用域来搜索所使用的每个变量。

这就是 jQuery 和 Prototype 这样的现代框架使用链接的原因之一。他们使用calland applyon 函数来控制this代表什么,这意味着您调用this.something而不是with(this){something}

所以回答你的问题:有一个很好的用途with- 允许 90 年代编写的 IE4 和 IE5 网站今天仍然可以工作。

就是这样。您不应该在新代码中使用它。


归档时间:

查看次数:

248 次

最近记录:

12 年,4 月 前