0

你好,我是 JavaScript 的初学者,我正在尝试弄清楚 IIFE 是如何工作的,但我仍然遇到了一些麻烦。在讲座中,我偶然发现了这个示例代码,对下面代码的评估给出了“未定义”的结果,而用“add()”调用函数返回 1,我真的不明白为什么,因为函数是一个 IIFE。

var add = (function() {
       var counter = 0;

       return function() {
            counter += 1;
            return counter 
       }
})();
//Output: undefined
4

3 回答 3

1

You IIFE 是一个工厂函数。在这种情况下,它返回一个函数,这样就可以了。您可以将结果分配给变量,然后运行结果函数。该counter变量是“封闭的”,它将通过返回的函数进行操作(并返回),但“外部世界”将无法访问它。

// assign the result to a variable
const add = (function() {
  let counter = 0;
  return function() {
    counter += 1;
    return counter;
  }
})();

// add is a function: execute it a few times
add();
add();
console.log(add()); // => 3

于 2021-03-14T11:36:07.227 回答
1

您的 IIFE 没有任何问题。您只看到var语句的结果。例子:

var x = function() {};
//=> undefined
var x = 42;
//=> undefined
var x = true;
//=> undefined

赋值表达式将计算右侧的值:

y = 10;
//=> 10

但是var语句本身什么也不返回:

var y = 10;
//=> undefined

规范的相关部分:

变量声明:BindingPattern 初始化器

  1. 令 rhs 为计算 Initializer 的结果。
  2. 让 rval 成为 ? 获取值(右)。
  3. 返回为 BindingPattern 传递 rval 和 undefined 作为参数执行 BindingInitialization 的结果。

https://tc39.es/ecma262/#sec-variable-statement

于 2021-03-14T11:51:11.593 回答
-1

对于 IIFE,您需要将匿名函数包装在“()”中,然后使用“();”调用它 它不允许声明。尝试删除声明。

(function() {
   var counter = 0;

   return function() {
        counter += 1;
        return counter 
   }
})();

有关更多信息,请参阅此。 https://www.tutorialsteacher.com/javascript/immediately-invoked-function-expression-iife

于 2021-03-14T11:08:33.290 回答