函数声明与函数表达式的提升剖析

函数声明 

function fn(){console.log('fn')}

函数表达式

var fn1 = function(){console.log('fn1')}​;

在页面加载过程中,解析器在向执行环境加载数据时,对函数声明和函数表达式并非一视同仁.解析器会先读取函数声明,并保证在页面执行其他代码之前该函数是可执行的。

至于函数表达式,则必须等到解析器执行到它所在行,才会被真正解释执行。也就是说,先对变量 var fn1;进行变量提升,等解析器执行到 fn1 = function(){}所在行时才能解释执行。

例如

 

1 alert(sum(1,2));
2 
3 function sum(num1,num2){
4 
5 return nu1 + num2;
6 
7 }​

 

以上代码执行完全没有问题。

 

1 alert(sum(1,2));
2 
3 var sum = function(num1,num2){
4 
5 return num1 + num2;
6 
7 }​;

 

以上代码​会在运行期间产生错误,原因是在函数执行到alert的时候,变量sum中并没有保存对函数的引用。而且,由于第一行代码就会导致 unexpected identifier (意外标识符错误),实际也不会执行到下一行。

 

除了什么时候可以通过变量访问函数这一个区别之外,函数声明和函数表达式语法其实是等价的。

 

也可以同时使用函数声明和函数表达式。

var sum = function sum(num1,num2){};​

不过这种语法,在Safari中会导致错误。​

posted @ 2016-06-24 14:18  黑白红尘  阅读(167)  评论(0编辑  收藏  举报