实际上,解释器在向执行环境加载数据时,对函数声明与函数表达式并不是一视同仁的。解析器会率先读取函数声明,并使其中在执行任何代码之前可以访问,至于函数表达式,则必须等到解析器执行到它所在的代码行时,才会被真正解析执行的。

先看个例子:

alert(sum(10,10));

function sum(num1,num2){

return num1+num2;

}

上面的例子是可以正常执行的。因为在代码执行之前,解析器已经通过一个名为声明函数提升过程。读取并将函数声明添加到执行环境中。然后在对代码求值时,js引擎在第一遍会声明函数,并将它们放在源代码树的顶部,所以,即使声明函数的代码在调用它的代码之后,js引擎也能将函数声明提升到顶部。

我们再看一个例子:

alert(sum(10,10));

var sum=function(num1,num2){

return num1+num2;

}

以上代码会在运行期间产生错误,原因在于函数位于一个初始化语句中,而不是函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用;而且,由于第一行代码就会导致“意外标示符”的错误,实际上也不会运行到下一行的。


还有,如果要访问函数的指针而不执行其函数体的话,必须去掉函数名后面的那对圆括号!