呵呵!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构造函数这么奇葩,实际应用会很少啦。。。。况且,可能还会影响性能。