//函数声明
var functionOne =function(){
//code....
}
//函数表达式
function functionTwo(){
//code....
}
在JS中, 这两个不同方式来定义function时,有个区别在于functionOne定义于run-time时期,functionTwo定义于parse-time。
也就是说
<script>
//报错
functionOne();
var functionOne =function(){
//code....
}
</script>
<script>
//正常
functionTwo();
function functionTwo(){
//code....
}
</script>
而且,functionOne 仅仅是一个变量,一个匿名函数的返回值赋值给了它而已。
函数表达式与其他表达式一样,在使用前必须赋值
即使像如下定义函数,它依旧是一个匿名函数,把对它的引用存储在变量
functionThree中。它并没有真正把对函数的引用存储到名为fact的变量中,而只是允许函数体引用这个名字来引用自身
var functionThree = function fact(x){
if(x<1)
return 1;
else
return x*fact(x-1);
}
再看下面两段代码:
if(condition){
function sayHi(){
alert("Hi");
}
}else{
function sayHi(){
alert("Yo");
}
}
表面上看,以上代码表示在condition为true时,使用一个sayHi()的定义否则,就使用另一个定义。实际上,这在ECMAScript中属于无效语法,JavaScript引擎会尝试修正错误,将其转换为合理的状态。但问题是浏览器尝试修正错误的做法不一致。大多数浏览器会返回第二个声明,忽略condition;FireFox会再condition为true时,返回第一个声明。因此这种使用方式很危险,不应该出现在你的代码中。不过使用函数表达式,那就没有什么问题了。
var sayHi ;
if(condition){
sayHi = function (){
alert("Hi");
}
}else{
sayHi = function (){
alert("Yo");
}
}
上面 的例子不会有什么意外,不同的函数会根据condition被赋值给sayHi