定义with语句的目的主要是为了简化多次编写同一对象的工作
with语句将object添加到作用域链的头部,然后执行statement,最后把作用域链恢复到原始状态
with(object){ statement; }
作用
在对象嵌套层次很深的时候通常会使用with语句来简化代码编写。而本质上是通过将一个对象的引用当作作用域来处理,将对象的属性当作作用域中的标识符来处理,从而创建了一个新的词法作用域
在客户端javascript中,可能会使用类似下面这种表达式来访问一个HTML表单中的元素
document.forms[0].address.value
如果这种表达式在代码中多次出现,则可以使用with语句将form对象添加到作用域链的顶层
with(document.forms[0]){ name.value = ''; address.value = ''; emai.value = ''; }
这种方法减少了大量的输入,不用再为每个属性名添加document.forms[0]前缀。这个对象临时挂载在作用域链上,当javascript需要解析诸如address的标识符时,就会自动在这个对象中查找
[注意]with语句提供了一种读取对象的属性的快捷方式,但它并不能创建对象的属性
如果对象o有一个属性x,那么下面代码给这个属性赋值为1
var o = {x:0}; with(o) x = 1; console.log(o.x);//1
如果o中没有定义属性x,下面代码和不使用with语句的代码x=1是一模一样的。这是因为对变量x进行了LHS查询,并将1赋值给它
var o = {}; with(o) x = 1; console.log(o.x);//undefined console.log(x);//1
副作用
与eval类似,with语句的javascript代码非常难于优化,同时也会给调试代码造成困难,并且同没有使用with语句的代码相比,它运算得更慢
而且,如果with语句不当,还有可能造成变量泄漏,污染全局作用域的情况
var x = 1; var o = {}; with(o){ x = 2; } console.log(x);//2 console.log(o.x);//undefined
严格模式
严格模式下,禁止使用with语句
//SyntaxError: Strict mode code may not include a with statement 'use strict'; var o = {}; with(o){ x = 2; }
Atas ialah kandungan terperinci JavaScript中with语句作用和副作用实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!