定义函数有两种方式:一种是函数声明,一种是函数表达式。
函数声明的方式:是由function关键字,然后是函数名指定函数的方式。(FF、Safari、chrome、opera都给函数指定了一个非标准的name属性,通过这个属性可以访问到给定函数指定的名字。)
关于函数声明,有个重要特征就是函数声明提升。意思是在执行代码之前,会先读取函数声明。这就意味着函数执行可以放在函数声明之前执行。
sayHi()
function Sayhi(){
//函数体
}
函数表达式的方式:先说一种常见的写法
var fnName = function() {
//函数体
}
这种情况下创建的函数叫做匿名函数(又叫做拉姆达函数),匿名函数的name属性值为空字符串。
注意:函数表达式和其他表达式一样,在使用前必须赋值,如下(不要这样去做)
fnName()
var fnName = function Sayhi(){
//函数体
}
理解函数提升的关键,就是理解函数声明与函数表达式之间的区别。
下面举一个例子:
if(condition){
function say(){
alert(1)
}
}else{
function say(){
alert(2)
}
}
如上写法,大多数浏览器会返回第二个函数声明,但是FF会在condition为true的时候返回第一个函数声明。这样做是很危险的行为。如果改为以下的写法就可以了。
var say;
if(condition){
say = function (){
alert(1)
}
}else{
say = function (){
alert(2)
}
}