呵呵!Function构造函数

今天准备吐槽一下Function构造函数。

我们知道,不管是函数声明还是函数表达式都是基于词法作用域的,明白这点在闭包中十分重要,譬如:

var a='global';
function foo(){
    var a='local';
    return function(){
         console.log(a);
    } 
}
foo()();   // local

根据词法作用域规则,函数所能访问的变量取决于它声明的位置,以上面的例子,函数沿作用域链查找,找到第一个变量a就停止查找(即找到局部变量a就停止查找,并不会继续查找全局变量a),所以理所当然输出'local',即局部变量a的值。

但是!但是比较奇葩的是,Function构造函数并不是基于词法作用域的,它向往的是全局作用域(傲娇。。。):

var a='global';
function foo(){
    var a='local';
    return new Function('console.log(a)');
}

foo()();    // global

你看,它输出的是全局的a值。

哎,实际上你可以把Function构造函数看成全局作用域运行的eval(),不过,既然Function构造函数这么奇葩,实际应用会很少啦。。。。况且,可能还会影响性能。

原文地址:https://www.cnblogs.com/linweinb/p/8567997.html