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
评论前必须登录!
注册