Javascript函数声明之间的区别

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

setInterval(myFunc, 100);

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

setInterval(myFunc, 100);

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

根据ECMA标准,第一个例子是一个函数语句,而第二个例子是一个函数表达式。 根据Javascript,函数语句被视为一个定义,这意味着在第一个示例中它可以通过整个函数(或脚本,如果它不在函数中)可见。 但在第二个示例中, var myFunc在第二行之前不会具有函数 myFunc的值,因此setInterval将被传递为undefined

函数语句和表达式之间唯一的语法区别是语句不包含在较大的表达式中:例如: (function foo() {})是一个表达式,而function foo() {}是一个语句。

注:我相信旧IE(pre 9?)将所有函数表达式视为定义。

为了阐述这个答案,请考虑以下代码:

    <script language="javascript">
        alert(A);
        alert(B);
        function A() {return "A value";}
        var B = function B(){ return "B value";}

        alert(A);
        alert(B);
    </script>

这将提醒(按顺序):

  • 函数A()...
  • 未定义
  • 函数A()...
  • 函数B()...

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

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

    要么

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

    他们都是一样的。


    在第一个例子中:

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

    函数声明是在任何代码执行之前处理的,所以当setInterval被调用时,myFunc作为本地参数存在。

    第二个例子:

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

    工作原理完全一样:myFunc使用var声明,因此在setInterval被调用时作为局部变量存在。

    编辑

    哎呀! 它不起作用。 当setTimeout被调用时,myFunc的值被计算,并且在那个时候myFunc没有被赋值,所以会产生错误。 稍后更改值不会影响setTimeout的值。

    最后,没有“功能说明”这样的东西。 ECMA-262在§13中定义了FunctionDeclaration和FunctionExpression,没有其他类型的函数。

    链接地址: http://www.djcxy.com/p/17267.html

    上一篇: Difference between Javascript function declarations

    下一篇: Why use named function expressions?