爱生活,爱编程,学习使我快乐
函数表达式是javascript中的一个既强大又容易令人困惑的特性。定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。
function functionName (arg0, arg1, arg2) {
// 函数体
}
var functionName = function (arg0, arg1, arg2) {
// 函数体
}
// 或
var functionName = function fn (arg0, arg1, arg2) {
// 函数体
}
函数名可写可不写,有名叫“命名函数表达式”,无名叫“匿名函数表达式”
常见格式如下
function aaa(){} // 函数声明
var aaa = function a (){} // 命名函数表达式
var aaa = function (){} // 匿名函数表达式
函数放在()中,或者加位运算符,都会变成函数表达式。如下
(function aaa() {})
~function aaa() {}
-function aaa() {}
+function aaa() {}
!function aaa() {}
function aaa() { alert(1); }(); //报错
var a = function aaa() { alert(1); }(); //直接执行,弹出1
~function aaa() { alert(1); }(); //直接执行,弹出1
因为函数声明有一个重要特征就是【函数声明提升】,意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。
sayHi();
function sayHi () {
alert("Hi!");
}
函数表达式与其它表达式一样,在使用前必须先赋值。以下代码会导致错误。
sayHi(); // 错误:函数还不存在
var sayHi = function () {
alert("Hi!");
}
这种情况下使用【函数声明】会有问题
if(true){
function aaa(){ alert(1); }
}else{
function aaa(){ alert(2); }
}
aaa();
// 在部分浏览器下结果是1,在IE下结果是2
// 因为函数已经被预解析,if判断已经没有意义
使用【函数表达式】则没有问题
if(true){
var a= function aaa(){ alert(1); }
}else{
var a = function aaa(){ alert(2); }
}
a();
// 在部分浏览器下结果是1,在IE(IE8以下)下结果也是1
aaa();
// 使用【命名函数表达式】的时候,IE(IE8以下)下结果是2,其它浏览器下报错。所以不建议使用【命名函数表达式】。
// 但是在使用debugger的时候,需要用到【命名函数表达式】。