eval

版权声明:个人笔记,不喜勿喷 https://blog.csdn.net/qq_39571197/article/details/87636190

不推荐用,所以没仔细看过

1、返回值 ,行为和逗号操作符很相像

看个例子,就差不多了。

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

 

2、 间接调用,直接使用全局作用域

// 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();

 

没有更多推荐了,返回首页