JavaScript中的函数表达式与声明之间有什么区别?

这个问题在这里已经有了答案:

  • var functionName = function(){} vs function functionName(){} 31个答案

  • 他们其实非常相似。 你怎么称呼它们是完全一样的。区别在于浏览器如何将它们加载到执行上下文中。

    函数声明在任何代码执行之前加载。

    函数表达式仅在解释器到达该行代码时加载。

    所以如果你在加载之前尝试调用一个函数表达式,你会得到一个错误! 如果你调用函数声明,它会一直工作,因为在加载所有声明之前不能调用代码。

    示例:函数表达式

    alert(foo()); // ERROR! foo wasn't loaded yet
    var foo = function() { return 5; } 
    

    例如:函数声明

    alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
    function foo() { return 5; } 
    


    至于你的问题的第二部分:

    var foo = function foo() { return 5; } var foo = function foo() { return 5; }与其他两个真的是一样的。 这只是这行代码用于导致safari中的错误,尽管它不再。


    函数声明

    function foo() { ... }
    

    由于函数提升 ,可以在定义之后和之前调用以这种方式声明的函数。

    函数表达式

  • 命名函数表达式

    var foo = function bar() { ... }
    
  • 匿名函数表达式

    var foo = function() { ... }
    
  • foo()只能在创建后调用。

    立即调用函数表达式(IIFE)

    (function() { ... }());
    

    结论

    Crockford建议使用函数表达式,因为它明确指出foo是一个包含函数值的变量。 那么,我个人更喜欢使用宣言,除非有表达的理由。


    关于第三个定义:

    var foo = function foo() { return 5; }
    

    下面是一个例子,说明如何使用递归调用的可能性:

    a = function b(i) { 
      if (i>10) {
        return i;
      }
      else {
        return b(++i);
      }
    }
    
    console.log(a(5));  // outputs 11
    console.log(a(10)); // outputs 11
    console.log(a(11)); // outputs 11
    console.log(a(15)); // outputs 15
    

    编辑:闭包的更有趣的例子:

    a = function(c) {
     return function b(i){
      if (i>c) {
       return i;
      }
      return b(++i);
     }
    }
    d = a(5);
    console.log(d(3)); // outputs 6
    console.log(d(8)); // outputs 8
    
    链接地址: http://www.djcxy.com/p/17263.html

    上一篇: What is the difference between a function expression vs declaration in JavaScript?

    下一篇: Are anonymous functions a bad practice in JavaScript?