避免使用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的对象的内容。所以引擎无法优化代码。
最差的情况将会导致其他优化无意义,使得引擎完全不做任何优化。

上一篇下一篇

猜你喜欢

热点阅读