JavaScript IIFE 评估未定义

问题描述

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

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

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

解决方法

你是一个factory function。在这种情况下,它返回一个函数,这样就可以了。您可以将结果分配给变量,然后运行结果函数。 counter 变量是“closed over”,它将通过返回的函数进行操作(和返回),但“外部世界”无法访问它。

// 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

,

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

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

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

y = 10;
//=> 10

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

var y = 10;
//=> undefined

规范的相关部分:

VariableDeclaration : BindingPattern 初始化器

  1. 让 rhs 成为对 Initializer 求值的结果。
  2. 让 rval 是? GetValue(rhs)。
  3. 返回为 BindingPattern 传递 rval 和 undefined 作为参数执行 BindingInitialization 的结果。

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

,

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

(function() {
   var counter = 0;

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

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