避免使用eval及with
2019-06-10 本文已影响0人
Ronswhite
JavaScript中有两个可以破坏作用域的函数eval和with
eval
function foo(str, a) {
eval(str);
console.log(a, b);
}
var b = 3;
foo("b = 2", 1); // 1 2
上面代码运行后直接会修改全局作用域中b的值,破坏代码作用域。
with
var obj = {a:1};
with(obj) {
a = 6;
b = 2;
}
console.log(obj.a); //6
console.log(obj.b); //undefined
console.log(b);//2
上面代码执行到b = 2时,引擎会执行LHS查询,在全局作用域中创建变量b,破坏代码作用域。
eval和with不仅仅会破坏作用域,而且还给程序优化带来不便。
由于引擎在编译阶段无法确定传给eval的参数是什么,也无法确定传给with的对象的内容。所以引擎无法优化代码。
最差的情况将会导致其他优化无意义,使得引擎完全不做任何优化。