在回答我关于with
statement的问题时,Alan Storm's comments引起了我的思考。我很少找到使用这个特殊语言特性的理由,也从来没有想过它可能会带来什么麻烦。现在,我很好奇如何才能有效地使用with
,同时避免它的陷阱。
您发现with
语句的用处在哪里?
发布于 2009-09-22 19:27:04
我一直使用with语句作为作用域导入的一种简单形式。假设您有一个某种标记构建器。而不是写:
markupbuilder.div(
markupbuilder.p('Hi! I am a paragraph!',
markupbuilder.span('I am a span inside a paragraph')
)
)
您可以改为这样写:
with(markupbuilder){
div(
p('Hi! I am a paragraph!',
span('I am a span inside a paragraph')
)
)
}
对于这个用例,我没有做任何赋值,所以我没有与之相关的歧义问题。
发布于 2009-06-22 18:18:03
是的,是的,是的。有一种非常合法的用途。观看:
with (document.getElementById("blah").style) {
background = "black";
color = "blue";
border = "1px solid green";
}
基本上,任何其他DOM或CSS挂钩都是with的奇妙用途。这并不是说"CloneNode“将是未定义的,并回到全局作用域,除非您走出自己的方式并决定使其成为可能。
Crockford抱怨的速度问题是,使用创建了一个新的上下文。上下文通常是昂贵的。我同意。但是如果你刚刚创建了一个div,并且手头没有用于设置css的框架,并且需要手动设置15个左右的CSS属性,那么创建一个上下文可能比创建变量和取消15个引用更便宜:
var element = document.createElement("div"),
elementStyle = element.style;
elementStyle.fontWeight = "bold";
elementStyle.fontSize = "1.5em";
elementStyle.color = "#55d";
elementStyle.marginLeft = "2px";
等等。
发布于 2008-09-14 19:29:13
您可以定义一个小帮助器函数来提供with
的好处,而不会有歧义:
var with_ = function (obj, func) { func (obj); };
with_ (object_name_here, function (_)
{
_.a = "foo";
_.b = "bar";
});
https://stackoverflow.com/questions/61552
复制相似问题