周梦康 发表于 2014-06-08 3023 次浏览 标签 : javascript
摘自:《JavaScript高级程序设计》5.5.2 函数声明与函数表达式

下面代码能正常执行

alert(sum(10,10));
function sum(num1, num2){
    return num1 + num2;
}

因为在代码开始执行之前,解析器就已经通过一个名为函数声明提升 (function declaration hoisting)的过程,读取并将函数声明添加到执行环境中。对代码求值时,JavaScript 引擎在第一遍会声明函数并将它们放到源代码树的顶部。所以,即使声明函数的代码在调用它的代码后 面,JavaScript 引擎也能把函数声明提升到顶部。如果像下面例子所示的,把上面的函数声明改为等价的函数表达式,就会在执行期间导致错误。

//在控制台复制测试不会报错,请写到页面里,再打开页面测试
alert(sum(10,10));
var sum = function(num1, num2){
    return num1 + num2;
};

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

评论列表