因为各种规范都不推荐用,所以没仔细看过
返回值 ,行为和逗号操作符很相像,看个例子,就差不多了。
const log = console.log; let x = null,str = null; str = "x=10;"; log(eval(str)); // 10 str = "x=10;(function(){})();"; log(eval(str)); // undefined str = "x=20;(function(){return x;})();"; log(eval(str)); // 20 /* 可以看出,行为和逗号操作符很相像 */ log( (x=110) ); // 110 log( (x=110,(function(){})()) ); // undefined log( (x=210,(function(){return x;})()) ); // 210
(new)调用方式:直接、间接,补充了一下this
(old)调用方式:直接、间接
间接调用,直接使用全局作用域
// mdn的例子 function test() { var x = 2, y = 4; console.log(eval("x + y")); // 直接调用,使用本地作用域,结果是 6 var geval = eval; // 等价于在全局作用域调用 console.log(geval("x + y")); // 间接调用,使用全局作用域,throws ReferenceError 因为`x`未定义 (0, eval)('x + y'); // 另一间接调用的例子 } test();
主要说一下这个 (0, eval)('x + y'); // 另一间接调用的例子
1、首先逗号操作符返回最后一个值
2、(0,eval)是个表达式,使用了逗号操作符,相当于是求值操作,求值之后是eval。。等价于间接调用了
3、改动一下例子
// 不使用 逗号操作符 function test() { var x = 2, y = 4; console.log( (eval)('x + y') ); // 6 } test();
// 使用 逗号操作符 function test() { var x = 2, y = 4; console.log( (eval,eval)('x + y') ); // ReferenceError x is not defined,由于间接调用,又成了全局作用域 } test();