• 发现的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.但是目前并没有发现为何会出现这样的结果。待研究

  • 相关阅读:
    站立会议(3)
    站立会议(2)
    站立会议(1)
    团队报告
    Laravel5.1 模型 --一对多关系
    jQuery 操作DOM
    Laravel5.1 模型 --一对一关系
    Laravel5.1 模型--查询作用域
    Laravel5.1 模型--ModelFactory
    jQuery 选择器
  • 原文地址:https://www.cnblogs.com/jyybeam/p/6248838.html
Copyright © 2020-2023  润新知