Javascript闭包和IIFE(立即调用函数表达式)

3

闭包通过引用(而不是值)存储其外部变量。然而,在下面的代码中,我想按值存储。有人可以展示如何使用IIFE来实现吗?

var i = -1;
var f = function () {
    return i; // I want to capture i = -1 here!
};
i = 1;
f();    // => 1, but I want -1
2个回答

11

你所发布的实际上不是一个IIFE:IIFE指立即调用函数表达式;你有一个函数但你并没有立即调用它!

抛开这一点,这里的想法是将感兴趣的状态位存储在函数参数中,使其成为一个独立的引用。你可以通过创建另一个函数(Function Expression部分),然后使用全局变量来调用它以捕获其状态(Immediately Invoked部分)来实现这一点。以下是示例:

var i = -1;
var f = (function(state) { // this will hold a snapshot of i
            return function() {
               return state; // this returns what was in the snapshot
            };
         })(i); // here we invoke the outermost function, passing it i (which is -1).
                // it returns the inner function, with state as -1
i = 1; // has no impact on the state variable
f(); // now we invoke the inner function, and it looks up state, not i

谢谢。是的,我知道这段代码没有使用IIFE。(我发布后又将其删除以避免混淆)。 - cmutex

0

作为IIFE - 立即调用函数。

var i = -1;
var f = function () {
    return i; // I want to capture i = -1 here!
}();// invoked here
i = 1;
console.log(f);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接