首先,函数声明和函数表达式的区别如下:
//函数声明
function foo(){}
//函数表达式
(function foo(){})()
//函数表达式
var foo = function(){};
在使用函数声明时,提升的过程如下:
foo();//function foo success
function foo(){console.log('function foo success');}
====>(等价于)
function foo(){console.log('function foo success');}
foo();//function foo success
在使用函数表达式时,提升的过程如下
foo();//TypeError
var foo = function(){};
====>
var foo;
foo();//TypeError
foo = function(){};
foo();//TypeError
bar();//ReferenceError
var foo = function bar(){};
====>
var foo;
foo();//TypeError
bar();//ReferenceError
foo = function(){
var bar = self;//类似于这样的格式
};