函数的声明方式
在定义一个函数的时候通常有两种声明方式:
不同之处
1、函数表达式后面加括号可以直接执行 2、函数声明会提前预解析
预解析
让我们先看一个例子:
function foo(){ console.log('函数声明'); }
var foo_later = function(){ console.log('函数表达式'); }
可以看到,函数声明foo被预解析了,它可以在其自身代码之前执行;而函数表达式foo_later则不能。要解决这个问题,我们先要弄清楚JavaScript解析器的工作机制。
变量提升(hoist)
JavaScript解析器会在自身作用域内将函数声明提前(hoist),
也就是说,上面的例子其实被解析器理解解析成了以下形式:foo();
foo_later();
foo_later = function(){ console.log('函数表达式'); }
这样也就可以解释,为什么在函数表达式之前调用函数,会返回错误了,因为它还没有被赋值,只是一个未定义变量,当然无法被执行。
console.log(declaredLater);
该段代码可以被解析成一下形式:
<div class="jb51code">
<pre class="brush:js;">
var declaredLater;
console.log(declaredLater); // undefined
declaredLater = "Now it's defined!";
console.log(declaredLater); // Now it's defined!