function foo(){} 在进入函数执行上下文开始执行代码的时候,foo已经是一个function了。
var foo = function(){}中,foo在进入函数执行上下文开始执行代码的时候,foo是undefined,直到执行完var foo = function(){}这句,foo才会得到赋值。
最关键的区别在于JavaScript函数与变量的“提前”行为。
声明提升:
变量的声明提升:把变量的声明提升到当前作用域的最前面;
函数的声明提升:把函数的声明提升到当前作用域的最前面,位于前置的变量声明后面。
JS解析器:
1.找一些东西: var ,function,参数
2.逐行解读代码:
表达式: = + - * / % ++ -- ! 参数 ……(表达式可以修改解析的值)。
function hereOrThere(){ return 'here'; }
alert(hereOrThere()); // 'There'
function hereOrThere(){ return 'there'; }
由于函数的声明提升,以上代码编译后相当于:
function hereOrThere(){ return 'here'; }
function hereOrThere(){ return 'there'; }
alert(hereOrThere()); // 'There'
声明前置了,但因为这里的声明和赋值在一起,所以一起前置,如下所示:
var hereOrThere = function(){ return 'here'; }
alert(hereOrThere()); // 'here'
hereOrThere = function(){ return 'there'; }
以上代码编译后相当于:
var hereOrThere; //声明前置了
hereOrThere = function(){ return 'here'; }
alert(hereOrThere()); // 'here'
hereOrThere = function(){ return 'there'; }
网友评论