一、eval === window.eval
这是同一个函数。
但是,当在某个函数内部调用eval时,与调用window.eval是不同的。
var a = 0;
function f(){
// 2、如果有这行代码,那么"a = 2"修改的是局部变量a(===1);💡所在log不变
// 3、如果没有这行代码,那么"a = 2"修改的是全局变量a(===0);💡所在log为2
let a = 1;
// 1、eval在当前位置执行,相当于"a = 2"的执行环境是当前作用域
eval('a = 2');
}
f();
// 💡
console.log(a);
var a = 0;
function f(){
// window.eval,说明代码"a = 2"的执行环境是全局作用域,此时函数体无论如何定义变量a,都与它无关。因为此时的a代表全局变量a
// 故💡处a为2
window.eval('a = 2');
}
f();
// 💡
console.log(a);
当把eval赋值给一个变量时,调用这个变量,永远都等于调用window.eval:
(function (){
const _eval = eval;
_eval('var a = 1');
})();
// a将被挂载到window
console.log(window.a);
二、对于内存泄漏
为什么说使用eval会存在内存泄漏问题?
因为在函数内使用eval,在执行到当前代码前,解释器无法确定你的string内容是什么,说不定会有一些修改闭包内的变量或者函数体内定义的变量。所以垃圾回收机制根本不敢回收这些内存。
而对于window.eval,因为我把执行环境拉倒了全局环境,所以这个问题会好很多,因为解释器认为我执行代码所访问、操作的标识符一定是全局内存在的。而全局变量一般不会被自动回收。