我们先来看下面的两个例子
var n=1; function f(){ var n=2; var e=function(){ return n; }; return e; } alert(f()());//2
var n=1; function f(){ var n=2; var e=new Function("return n;"); return e; } alert(f()());//1
原因如下:JS解释器在解析代码时,并不是一行行地分析执行函数,而是一段一段地分析执行函数,在同一段代码中,使用function语句和函数直接量定义的函数结构总会被提取出来优先执行,只有当函数被解析和执行完毕后,才会按照顺序执行其他代码行,但是对于使用Function构造函数定义的函数并非提前执行,而是在运行时被动态地执行的,因此Function构造函数定义的函数具有顶级作用域
执行效率方面的差异:JS解释器首先把function语句定义的函数提取出来进行编译,这样每次执行该函数时,就不再从头开始重新编译该函数对象,而Function构造函数定义的函数每次执行时都需要动态编译一次,因此效率较function非常低。
Function函数不需要额外的变量,直接在表达式中参与运算,从而节省了资源,避免了使用function语句定义函数占用内存的弊端,因此该函数运行完毕就释放内存空间