JS特性Hoisting——提升
foo(); var foo = function(){ alert('hello') }
上面代码foo执行时会报错: foo is not a function.
而下面这段代码就会正常执行
foo(); function foo(){ alert('hello') }
原因是JS有一个特性叫做Hoisting,我们一般叫它'提升'。
它会把你声明的变量提到作用域的最顶部,而此变量定义的位置不变。下面就是声明和定义:
var a; // 声明变量 a = 1; // 定义变量
所以最上面那段代码经过JSHoisting后就会变成这样
var foo; foo(); function foo(){ alert('hello') }
所以当程序执行到foo()时,JS会报错foo不是一个函数,因为foo只是被声明了,而没有被定义。

浙公网安备 33010602011771号