我刚刚发现以下代码执行时没有错误(Chrome):
console.log(fa);
function fa(){}
我的印象是:
function fa(){}
与:
相同var fa = function(){};
我的假设让我相信上面的代码块应该导致错误,因为fa
在被调用之前没有被声明。但是,当我在上面的代码示例中使用时,第二种形式会产生错误,因为当第一行运行时尚未定义fa
。
是否有某些文档或信息涵盖function
关键字(在声明性地使用时)已预先实现的事实,从而在脚本中的代码行的实际操作顺序之前公开所述函数?
答案 0 :(得分:4)
以下
function fa(){}
是函数声明,声明函数fa
,而
var fa = function(){};
声明变量fa
并使用函数表达式的结果对其进行初始化。在范围内声明的JavaScript标识符已提升到范围的顶部,因此可在整个范围内使用。但是,初始化程序仍然会在它们出现的代码中的位置执行。
现在,您的函数表达式将被放置在代码中的位置执行(与任何其他初始化程序一样)。在执行初始化程序之前,变量将undefined
作为其值。
函数声明作为整体提升到作用域的顶部以及声明函数的标识符。因此,函数声明生成的fa
即使在函数声明发生的位置上方进行检查时也会存储正确的函数对象。
fa1(); // valid
fa2(); // error, fa2 is undefined, not a function
function fa1() {}
var fa2 = function() {};
fa1(); // valid
fa2(); // valid
有关使用JavaScript进行范围界定和提升的更多信息,请参阅this。