gpt4 book ai didi

javascript - 在函数中绑定(bind)一个变化的变量,我想要一个名字

转载 作者:行者123 更新时间:2023-11-28 13:13:45 25 4
gpt4 key购买 nike

我有类似的东西:

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

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

最佳答案

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

我之所以称其为“破坏性”闭包,是因为这就是你正在做的事情。

您看到这一点的经典地方是循环闭包的解决方案:

var hellos = [];

for (var i=0; i < 10; i++) {
hellos.push(
(function(j){
return 'hello ' + j
})(i)
);
}

问题是由外部变量和内部函数中对该变量的引用之间创建的闭包引起的(从技术上讲,该变量被称为“自由”变量而不是闭包,“闭包”在技术上指的是这样的机制:捕获变量,但在 js 社区中,我们最终将这两者称为闭包)。所以关闭是问题的原因。由于问题是由创建的闭包引起的,我开始将解决方案称为“打破闭包”。

请注意,尽管有些人称其为闭包,并且您可能会在 google 上搜索“js 闭包”以了解有关此技术的更多信息,但具有讽刺意味的是,它并不是一个闭包。它只是函数如何传递参数(关于 javascript 如何实际将参数传递给函数有一个完整的侧面争论,您可以在此处阅读: Why are objects' values captured inside function calls? )。 Javascript 是一种相当严格的按值传递语言,就像 C 是一种严格的按值传递语言一样(C 只能按值传递)。

当您在 js(对象、数组)中传递引用时,函数不会获取原始引用,而是获取引用的副本。由于它是一个引用,它显然指向与原始引用相同的对象,因此很容易错误地认为 JavaScript 是通过引用传递的。但是,如果您尝试将新对象分配给传入的引用,您会发现原始引用没有更改。例如:

function foo (x) {
x = [2,3];
}

var y = [1,2];
foo(y);
console.log(y) // prints [1,2] so foo() did not change y

正是这个机制负责打破外部变量(在您的示例中为i)和内部变量(_i 在你的例子中)。这种机制的名称就是函数调用(嗯,从技术上讲,它是函数调用的一个子集 - 它是参数传递给函数调用的方式)。

回顾一下:

  1. 我个人称之为“打破封闭”
  2. 有些人称其为“闭包”,即使它不是闭包(闭包是他们想要避免的)。
<小时/>

Side note: I realize that the original example is about a global variable but in javascript global variables are just a special case of closures - closures are ALWAYS created when you define a function, it's just that when there's no outer function the outer scope is simply the global scope.

关于javascript - 在函数中绑定(bind)一个变化的变量,我想要一个名字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com