在JS中声明函数:命名和未命名表达式

时间:2015-11-25 12:01:13

标签: javascript anonymous-function function-expression

Recentley我开始研究JS库Typeahead作为预测搜索框的解决方案。然而,在查看实现它的代码时,我开始更深入地研究一些事情,这使我在javascript中声明了函数。

我知道有三种主要方法可以实现这一目标:

  1. 功能声明
  2. 功能表达
  3. 功能构造
  4. 仔细查看function expressions,然后我转到anonymous functions。我对这些的理解是它们实际上是一个没有名字的function expression

    我的问题是命名函数表达式和匿名函数之间的区别,为什么我会选择使用匿名函数?匿名函数有什么好处(如果有的话)?

    如果你看到下面(我知道这是一个非常非常简单的例子),看起来他们几乎完全一样吗?我似乎无法区分它们。

     //Named function expression
       var add = function add(a,b){
           var result = a+b;
           console.log('adding ' + a + ' and ' + b + ' = ' + result);
       }
       add(6,2);
    
       //Anonymous function expression
       var multiply = function(a,b){
           var result = a*b;
           console.log('multiplying ' + a + ' by ' + b + ' = ' + result);
       };
       multiply(10,6);
    
       //Named function called immediately
       var divide = function myfunction(a,b){
           var result = a/b;
           console.log('dividing ' + a + ' by ' + b + ' = ' + result);
       }(10,5);
    
       //Anonymous function called immediately
       var subtract = function (a,b)
       {
           var result = a - b;
           console.log('subtracting ' + b + ' from ' + a + ' = ' + result);
       }(10,5);
    

    另一方面,这是导致我写这个问题的问题:Explanation of Typeahead.js substringMatcher function

    在代码中,作者使用匿名函数。无论如何,如果有人能为我清除这一点,我真的很感激。在你问之前我确实用谷歌搜索了这个并被带到各个不同的网站,概述了差异,但我更愿意在这里询问社区。

2 个答案:

答案 0 :(得分:2)

命名函数表达式可以递归调用自身。此外,它们的名称显示在堆栈跟踪中,这有助于调试。

除此之外,它只是代码风格的东西。

答案 1 :(得分:0)

虽然它的风格大多取决于你需要使用你的函数(API身份验证和调用)的方式和。但

使用函数表达式样式var add = function add(a,b),在调用函数之前,该函数实际上并未分配给add

使用function add(),函数声明将被提升,并且函数会立即分配给add。

简而言之,函数声明可以随时调用,函数表达式不能在声明之前被调用。< / p>

试试这个:

add1(5);

var add1 = function(num) {
  return num + 1;
};

然后:     ADD2(7);

function add2(num) {
  return num + 2;
};