自调用函数不保留私有值

self invoking function is not preserving the private value

本文关键字:保留 调用 函数      更新时间:2023-09-26

试图弄清楚为什么自调用函数保留了私有值,而其他类型的则没有。

确实增加了价值

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
}();
console.log(a());
console.log(a());
console.log(a());

输出 : 10,11,12

虽然此代码不会增加值

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};
console.log(a()());
console.log(a()());
console.log(a()());

输出:10,10,10

在你的第一个示例中,a 是一个闭包实例,在你的console.log中被重复调用:

console.log(a());  // <-- a is a closure, invoked once
console.log(a());  // <-- the same closure, invoked the second time
console.log(a());  // <-- the same closure, invoked a third time

但是,在第二个示例中,a 是在 console.log s 中重复调用的外部函数:

console.log(a()());  // <-- a is the outer, returning a new closure, invoked once
console.log(a()());  // <-- a is the outer, returning a new closure, invoked once
console.log(a()());  // <-- a is the outer, returning a new closure, invoked once

因此,您在第二个示例中所做的是每次都重新创建一个新的闭包,而不是重新调用与第一个示例中相同的闭包实例。

在第一种情况下,外部函数只被调用一次,但在第二种情况下,你调用它三次,每次你初始化闭包的单个myval回到 10; 所以最后你有三个单独的myval副本,它们的值都是 11,从递增一次开始。

您的第一个示例更等效于:

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};
var b = a();
console.log(b());
console.log(b());
console.log(b());

而你的第二个是这样的:

var a = function(){
    var myval=10;
    return function(){
          return myval++; 
    }
};
var b = a();
var c = a();
var d = a();
console.log(b());
console.log(c());
console.log(d());

每次调用 a()都会创建一个新的内部函数,因此在第一种情况下,您调用a一次,您有一个内部函数在作用域中具有单个myval,但在第二种情况下,您创建了三个单独的内部函数,每个函数在作用域中都有自己的myval