问题描述
你好,我是 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 初始化器
- 让 rhs 成为对 Initializer 求值的结果。
- 让 rval 是? GetValue(rhs)。
- 返回为 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