Javascript 在函数中绑定一个变化的变量,我想要一个名称

Javascript 在函数中绑定一个变化的变量,我想要一个名称,javascript,Javascript,我有一些东西,比如: var i = 0; var func = function(){ console.log(i); }; func(); //0 i++; func(); //1 我想让第二个控制台也输出“0”, 因此,我将程序更改为: var i = 0; var func = (function(_i){ return function(){ console.log(_i); }; })(i); func(); //0 i++;

我有一些东西,比如:

var i = 0;

var func = function(){
    console.log(i);
};

func(); //0

i++;

func(); //1
我想让第二个控制台也输出“0”, 因此,我将程序更改为:

var i = 0;

var func = (function(_i){
    return function(){
        console.log(_i);
    };
})(i);

func(); //0

i++;

func(); //0

我知道它是如何工作的,但是是否有任何名称或术语来描述这种机制?

当传入一个基本类型变量(如字符串或数字)时,值是按值传入的。这意味着在函数中对该变量的任何更改都与函数外部发生的任何更改完全不同


如果未声明作用域中的变量,它将搜索外部作用域,直到找到它,或搜索到窗口作用域。如果找不到,它将返回全局变量。

当传入一个基本类型变量(如字符串或数字)时,该值将按值传入。这意味着在函数中对该变量的任何更改都与函数外部发生的任何更改完全不同


如果未声明作用域中的变量,它将搜索外部作用域,直到找到它,或搜索到窗口作用域。如果找不到,它将返回全局变量。

它被称为闭包。您可以在此处阅读更多关于它们的信息:


这叫做闭包。您可以在此处阅读更多关于它们的信息:


我一直将这种机制称为“打破封闭”,尽管我过去曾与坚持将这种技术称为“封闭”的人发生过争执

我之所以称之为
“breaking”
闭包,是因为这正是您所做的

在循环中闭包的解决方案中,您可以看到这一点:

var hellos = [];

for (var i=0; i < 10; i++) {
    hellos.push(
        (function(j){
            return 'hello ' + j
        })(i)
    );
}
这个机制负责打破外部变量(在您的示例中是
i
)和内部变量(在您的示例中是
\u i
)之间的关联。这种机制的名称就是函数调用(从技术上讲,它是函数调用的一个子集,是参数传递给函数调用的方式)

因此,总结一下:

  • 我个人称之为“打破僵局”
  • 有些人称之为“闭包”,即使它不是闭包(闭包是他们想要避免的)

  • 旁注:我知道最初的例子是关于一个全局变量的,但在javascript中,全局变量只是闭包的一个特例——闭包总是在定义函数时创建的,只是当没有外部函数时,外部作用域就是全局作用域


    我一直将这种机制称为“打破封闭”,尽管我过去曾与坚持将这种技术称为“封闭”的人发生过争论

    我之所以称之为
    “breaking”
    闭包,是因为这正是您所做的

    在循环中闭包的解决方案中,您可以看到这一点:

    var hellos = [];
    
    for (var i=0; i < 10; i++) {
        hellos.push(
            (function(j){
                return 'hello ' + j
            })(i)
        );
    }
    
    这个机制负责打破外部变量(在您的示例中是
    i
    )和内部变量(在您的示例中是
    \u i
    )之间的关联。这种机制的名称就是函数调用(从技术上讲,它是函数调用的一个子集,是参数传递给函数调用的方式)

    因此,总结一下:

  • 我个人称之为“打破僵局”
  • 有些人称之为“闭包”,即使它不是闭包(闭包是他们想要避免的)

  • 旁注:我知道最初的例子是关于一个全局变量的,但在javascript中,全局变量只是闭包的一个特例——闭包总是在定义函数时创建的,只是当没有外部函数时,外部作用域就是全局作用域


    它被称为“传递值”与“范围内捕获变量”。请注意,这仅适用于
    数字
    是值类型的情况。您不能使用此技巧从对象“分离”。它称为“传递值”与“捕获范围内的变量”。请注意,这仅适用于
    数字
    是值类型的情况。你不能使用这个技巧来“分离”对象。闭包在哪里?什么是被关闭的?@torazaburo:读我的答案。由于对web 2.0早期的闭包有误解(或不完全理解),所以这个名称一直存在,这里的闭包在哪里?什么是被关闭的?@torazaburo:读我的答案。此名称因误解(或理解不完整)而保留web 2.0早期的闭包是什么有趣的注意:我开始看到Go程序员需要这种技术,这是一个好迹象,其他编程语言的人也开始大量使用闭包-这本身就是他们正在进行异步编程的迹象有趣的注意:我开始看到Go程序员需要这种技术这是一个很好的迹象,表明其他编程语言的人也开始大量使用闭包,这本身就是他们正在进行异步编程的一个迹象