var functionName=function(){}和functionName=function(){}有什么区别()

【var functionName=function(){}和functionName=function(){}有什么区别()】var functionName=function(){}和functionName=function(){}有什么区别?最近发现项目中的JS代码很多地方都使用这两种方式声明方式,不知道这两者有什么区别?使用这两种方式的原因是什么?方法的优缺点是什么?是否有一种方法用而另一种方法做不到的?例如如下代码:

var fn1 = function(){ // 函数体代码 } function fn2(){ // 函数体代码 }

它们不同的地方在于,fn1是一个函数表达式,和什么普通变量一样,在创建全局执行上下文的时候赋值为undefined,只有全局执行上下文入栈执行的时候才会真正赋值。而fn2是一个函数声明,它在创建全局执行上下文的时候就会初始化并被复制为函数的引用,例如下面的例子:
fn1(); // 创建执行上下文的时候该函数变量值为undefined,所以报错 var fn1 = function(){ console.log("fn1"); } fn2(); // 因为已经在全局执行上下文中创建,所以正常执行 function fn2(){ console.log("fn2"); }

另外,你不能有条件地定义一个函数,在if语句块中,无论如何在里面定义的函数都会被创建,如下例子:
if(false){ function fn3(){ console.log("fn3"); } } if("fn3" in window){ console.log("fn3"); // 输出: fn3,说明函数已在全局执行上下文中初始化 } console.log(fn3); // undefined fn3(); // 抛出异常:Uncaught TypeError: fn3 is not a function

    推荐阅读