JavaScript with语句和LHS和RHS查询

学习博客: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语句对代码的影响还是很大的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值