javascript函数声明之间的差异

Difference between Javascript function declarations

以下两个例子有什么区别?

1
2
3
setInterval(myFunc, 100);

function myFunc() { alert('asdf'); }
1
2
3
setInterval(myFunc, 100);

var myFunc = function myFunc() { alert('asdf'); }


根据ECMA标准,第一个示例是函数语句,而第二个示例是函数表达式。根据javascript,一个函数语句作为一个定义来计算,这意味着在第一个示例中,它可以通过整个函数(如果它不在函数中,则可以通过脚本)看到。但在第二个例子中,var myfunc直到第二行才具有函数myfunc的值,因此setinterval将通过undefined

函数语句和表达式之间唯一的语法差异是不包含语句的是更大的表达式:例如:(function foo() {})是表达式,而function foo() {}是语句。

NB:我相信老的IE(9岁以前的?)将所有函数表达式视为定义。

要解释此答案,请考虑以下代码:

1
2
3
4
5
6
7
8
    <script language="javascript">
        alert(A);
        alert(B);
        function A() {return"A value";}
        var B = function B(){ return"B value";}

        alert(A);
        alert(B);

这将发出警报(按顺序):

  • 函数a()…
  • 未定义
  • 函数a()…
  • 函数B()…

  • 在第一个示例中:

    1
    2
    3
    > setInterval(myFunc, 100);
    >
    > function myFunc() { alert('asdf'); }

    函数声明是在执行任何代码之前处理的,因此调用setinterval时,myfunc作为本地参数存在。

    第二个例子:

    1
    2
    3
    4
    > setInterval(myFunc, 100);
    >
    > var myFunc = function myFunc() {
    > alert('asdf'); }

    的工作原因完全相同。:myfunc使用var声明,因此在调用setinterval时作为局部变量存在。

    编辑

    哎哟!它不起作用。调用setTimeout时会评估myfunc的值,此时myfunc没有分配值,因此会产生错误结果。稍后更改该值不会影响setTimeout所保留的值。

    最后,没有"函数语句"这样的东西。ECMA-262在第13节中定义了函数声明和函数表达式,没有其他类型的函数。


    两个样本基本上都在做相同的事情。在第二个示例中,还可以使用具有不同名称的命名函数或未命名函数。

    1
    var myFunc = function myOtherName() { alert('asdf'); }

    1
    var myFunc = function() { alert('asdf'); }

    它们都是一样的。


    在第一个示例中,您实际上为新创建的变量"myfunc"分配了一个函数数据类型。所以,"myfunc"是变量的名称,函数是数据类型。第一个相同:

    1
    var myFunc = function(){alert('asdf');}

    在第二个例子中,我从未见过类似的情况。我不知道它是否是声明函数的有效方法…