JavaScript: 函数声明与函数表达式

//函数声明
 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值