发现的eval的一个小问题

  首先我们来看五段代码:

  第一段代码:

function test(){
    eval('var a = 1;');
    alert(a);
}
test();

  第二段代码:

function test(){
    eval('var a = 1;');
}
test();
alert(a); 

  第三段代码:

function test(){
    eval('a = 1;');
}
test();
alert(a);

  第四段代码:

function test(){
    window.eval('var a = 1;');
}
test();
alert(a);

  第五段代码:

function test(){
    var e = eval;
    e('var a = 1;');
}
test();
alert(a);

  

  首先结果是: 第一段代码:1;第二段代码:错误;第三段代码:1;第四段代码:1; 第五段代码:1;。

  之所以出现这样的结果主要是因为局部变量的原因。

  首先第一段代码中,eval在test的局部环境中执行了代码:var a = 1。就相当于在test函数中执行了var a = 1。因此在test中执行alert(a)当然会输出1。

  但是,在第二段代码中,将alert(a)放在了test外,那么我们知道此时的a就应该是全局的变量,但是eval执行的却是局部变量。因此,由于作用域链的原因,就会出现a未定义的错误出现。

  于是在第三段代码中,eval所执行的a并没有使用var来定义,那么我们知道这就表示在修改全局变量a的值(当然这种方式在严格模式下依旧是错误的)。此时alert的a的值就可以得到。

  第四段代码中,我们使用了window.eval();那么此时的eval就明确表示在window的环境下执行,那么此时执行的a就是全局变量,结果就是1了。

  第五段代码,结果是1.但是目前并没有发现为何会出现这样的结果。待研究

原文地址:https://www.cnblogs.com/jyybeam/p/6248838.html