函数声明
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中会导致错误。