【问题标题】:Declaring functions in JS: Named and Unamed expression在 JS 中声明函数:命名和未命名表达式
【发布时间】:2015-11-25 12:01:13
【问题描述】:

最近我开始研究 JS 库 Typeahead 作为预测搜索框的解决方案。然而,在查看实现它的代码后,我开始更深入地研究事物,并导致我在 javascript 中声明函数。

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

  1. 函数声明
  2. 函数表达式
  3. 函数构造

仔细查看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

在代码中作者使用了一个匿名函数。无论如何,如果有人能为我解决这个问题,我将不胜感激。在你问之前,我确实已经用谷歌搜索过这个并被带到各种不同的网站,概述了这些差异,但我更愿意在这里问社区。​​p>

【问题讨论】:

  • 不喜欢命名函数表达式的一个原因是IE up to version 8 makes them global variables。也许如果这不是浏览器开发的一个特性,只要它是在语言爆炸式流行的时候,你就会看到更多的命名表达式。

标签: javascript anonymous-function function-expression


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    虽然它主要是样式化,但它可能会有所不同,具体取决于您需要如何以及何时使用您的函数(API 身份验证和调用)。

    使用函数表达式样式var add = function add(a,b),该函数实际上不会分配给add,直到它被调用。

    使用function add(),函数声明被提升并立即分配函数添加。

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

    试试这个:

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

    那么这个: 添加2(7);

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

    【讨论】:

    • 你在比较苹果和橘子。 OP 询问var add = function(a,b)var add = function add(a,b) 之间的区别。 “我的问题是关于命名函数表达式和匿名函数之间的区别” function add2(num) {...} 只是一个常规函数,而不是命名函数表达式或匿名函数。
    • 啊!我读得太快了,但它仍然适用。我应该包括匿名函数只是一个镜头,不需要再次使用,通常作为回调传递给其他函数。 IIFE 是(function(prams){})(args)function printNum(num, callback){ return callback(num)}printNum(5, function(num){ console.log(num); }); // 5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2016-04-30
    • 2012-12-31
    • 2017-10-09
    • 2013-08-16
    相关资源
    最近更新 更多