函数表达式和函数声明

创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符: 

    函数声明:

  function 函数名称 (参数:可选){ 函数体 }

  函数表达式:

  function 函数名称(可选)(参数:可选){ 函数体 }

所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

function foo(){}    //声明,因为它是程序的一部分
var bar = function foo(){};        //表达式,因为它是赋值表达式的一部分

new function bar(){};            //表达式,因为它是new表达式的一部分

(function() {
    function bar(){};        //声明,因为它是函数体的一部分
})();

function foo(){};        //函数声明
(function foo(){});    //函数表达式: 包含在分组操作中

try {
    (var x = 5);        //分组操作符,只能包含表达式而不能包含语句: 这里的var 就是语句
} catch(err) {
    //SyntaxError
}

try {
    { "x" : 5};            //"{"和"}"做解析成代码块
} catch(err) {
    // SyntaxError
}

({ "x": 5});        //分组操作符强制将”{“和"}"作为对象字面量来解析

另外,还有一点需要提醒一下,函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式:

//反例
if (true) {
    function foo() {
        return "first";
    }
} else {
    function foo() {
        return "second";
    }
}
foo();


//正解
if(true) {
    foo = function() {
        return "first";
    } ;
} else {
    foo = function() {
        return "second";
    };
};

foo();

小结:函数声明的规则总结

函数声明只能出现在程序函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值