JavaScript 2、eval 和 with 函数

/* * ========================================================= * * JavaScript 词法欺骗 * * 1.欺骗词法做用域,会致使性能降低。 * 2.引擎在代码中发现了,eval()和 with()函数时,引擎在词法阶段并不知道它们将接收的什么代码,引擎只能简单的假设关于标示符是无效的。 * 3.在javascript中编译源代码时,其中一步是对代码作大量的优化,当遇到上述两个函数时,引擎只能不作任何代码的优化,这个是下降性能的缘由。 * 4.eval()和 with()函数,都将在运行时起到做用。 * * ========================================================= * */// function foo(str, a) {//   eval(str); // 欺骗词法//   console.log(a, b); // 1 3// }//// var b = 2;//// foo("var b = 3;", 1);//// var obj = {//   a: 1,//   b: 2,//   c: 3// };//// console.log(obj.a);// console.log(obj.b);// console.log(obj.c);// with 一般被看成重复引用同一个对象中的多个属性的快捷方式。// 但不推荐使用,因会改变当前做用域,下降性能,而且可能形成变量泄漏。// 不用循环的重复的调用对象自己。// with (obj) {//   a = 3;//   b = 4;//   c = 5;// }//// console.log(obj.a);// console.log(obj.b);// console.log(obj.c);// with// 首先咱们知道a = 2; 是一个赋值操做(LHS)。当foo传入一个引用(obj),with会改变该// 引用做用域中的a属性值,当在该引用查找不到a变量时,做用域查找方式起到做用,向上层做用域执行查找a变量// 在该引用做用域、foo做用域、全局做用域中,都没有找到a变量时,with 就自动建立了一个全局变量(若是在上述做用域中查找到a变量将会改变其变量值),// 这也叫作变量泄漏,形成这个缘由是a=2 执行的时赋值操做,根据javascript中的特性,赋值操做前没有见变量声明标示符时,javascript就自动建立一个全局变量。// 前提是非严格模式下,才会产生以上内容,严格模式下,将彻底禁止使用with函数。// with 其实是根据你传递给它的对象引用,凭空的建立出一个全新的词法做用域。// var a = 10; // 这里能够验证with更改了a变量的值。若是没有定义这个变量,console.log( a );打印的也是2.// function foo(obj) {//   with (obj) {//     a = 2; // 彻底等于赋值操做//   }// }// var o1 = {a: 3};// var o2 = {b: 3};// foo(o1);// console.log(o1.a); // 2//// foo( o2 );// console.log( o2.a ); // undefined// console.log( a ); // 2——很差,a 被泄漏到全局做用域上了!
相关文章
相关标签/搜索