学习博客:JavaScript中with的用法 JavaScript中的LHS和RHS查询
with语句总结
- 改变作用域
- 容易造成内存泄漏
- 性能低
- “严格模式“下禁用
1.with语句可以方便多次修改对象中的值(通过改变对象的作用域)
// 修改obj对象中的变量
var obj = {
a: 1,
b: 2,
c: 3
}
// 方式一
obj.a = 11;
obj.b = 22;
obj.c = 33;
// 方式二
with (obj) {
a = 111,
b = 222,
c = 333
}
2.容易造成内存泄漏,所以不推荐使用
var obj1 = {
a: 1
}
var obj2 ={
b: 2
}
function foo(obj) {
with (obj) {
a = 2;
}
}
foo(obj1)
console.log("obj1.a", obj1.a)
foo(obj2)
console.log("obj2.a", obj2.a)
// 这里的a出现了“泄露”,非严格模式下,会自动在全局作用域创建一个全局变量
console.log(a)
最后一句代码打印出了全局变量a的值,这是由于执行foo(obj2)出现LHS查询生成的,
2.2LHS查询 RHS查询,详情查看JavaScript中的LHS和RHS查询
简单理解就是,“赋值 “或者“查询“,"赋值"属于LHS(Left-hand Side)查询,也就是变量名在左边,例如 var a = 1
"查询"属于RHS(Right-hand Side)查询,变量名在右边,例如 var a = b,对于变量a属于LHS,对于变量b属于RHS,凡是需要寻找变量的,都属于RHS查询。
3.性能低,JavaScript引擎无法对with语句做优化
function func () {
console.time("func")
var obj = {
a: 1
}
for (var i = 0; i < 1000000; i++) {
obj.a = i
}
console.timeEnd("func")
}
function _func () {
console.time("_func")
var obj = {
a: 1
}
for (var i = 0; i < 1000000; i++) {
with (obj) {
a = i
}
}
console.timeEnd("_func")
}
func()
_func()
可以看出,大量使用with语句对代码的影响还是很大的。