Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个JavaScript映射不是一个无限循环?_Javascript_Arrays_Closures_Map Function_Array Push - Fatal编程技术网

为什么这个JavaScript映射不是一个无限循环?

为什么这个JavaScript映射不是一个无限循环?,javascript,arrays,closures,map-function,array-push,Javascript,Arrays,Closures,Map Function,Array Push,我正在学习JavaScript。我写这段代码是为了学习map函数。但后来我弄糊涂了,为什么这不是在它上面连续映射,因为在每个映射序列中,一个新元素被推送到数组中。它不应该在映射过程中继续推动新的元素吗为什么映射功能只针对原来的三个元素运行,而不针对新推送的元素运行? 我尝试在节点环境中调试它,arr变量进入闭包。我知道这是一个什么样的结局,但我无法理解这里发生了什么 let数组=[1,2,3]; array.map((元素)=>{ 阵列。推送(10); 控制台日志(元素); });引用MDN:

我正在学习JavaScript。我写这段代码是为了学习map函数。但后来我弄糊涂了,为什么这不是在它上面连续映射,因为在每个映射序列中,一个新元素被推送到数组中。它不应该在映射过程中继续推动新的元素吗为什么映射功能只针对原来的三个元素运行,而不针对新推送的元素运行?

我尝试在节点环境中调试它,
arr
变量进入闭包。我知道这是一个什么样的结局,但我无法理解这里发生了什么

let数组=[1,2,3];
array.map((元素)=>{
阵列。推送(10);
控制台日志(元素);
});引用MDN:

map处理的元素范围是在第一次调用回调之前设置的。回调函数不会访问在对映射的调用开始后附加到数组中的元素。如果数组的现有元素发生更改,则传递给回调的值将是映射访问它们时的值

所以,它的行为是这样的,因为它就是这样设计的。除其他原因外,它的设计是为了防止无限循环


map
是函数编程世界的一个函数,其中不变性是一个重要原则。根据这一原则,如果您对输入调用
map
(其他变量不变),您将始终得到完全相同的结果。允许修改输入会破坏不变性。

为什么与MDN上看到的完全一样:

var new_array=arr.map(函数回调(currentValue[,index[,array]]){}

map处理的元素范围是在第一次调用回调之前设置的。在对map的调用开始后追加到数组中的元素将不会被回调访问

(感谢您在MDN的Joe的帖子中引用这句话。)

一旦调用了map,它就会将此时的数组作为它的参数;一旦传递了map,那么任何更改都与前面的变量本身无关

见下文:

let数组=[1,2,3];
array.map((元素)=>{
阵列。推送(10);
控制台日志(元素);
});

log(数组)
,因为它不会变异数组(请参阅)

相反,它返回一个新数组,其中包含对调用数组中的每个元素调用所提供函数的结果

在下面的代码片段中,改变
数组的是对
数组.push(10);
的调用三次(原始数组中每个元素一次),而不是
map
函数本身

let newArray = array.map((element) => {
    array.push(10); // <-- here you mutate the array
    console.log(element);
});

你在哪里看到这个结果?当我运行你的代码时,我只看到1,2,3,正如你在原始代码中预期的那样,你引用了
arr
,这是没有定义的;我假设你的意思是
array
。在迭代过程中修改数组并不会修改map的迭代。从前面提到的规范来看:
m处理的元素范围ap是在第一次调用回调之前设置的。在调用map开始后附加到数组中的元素不会被回调访问。
如果需要无穷大,可以使用
for
loop。我写了错误的输出。控制台中只有1 2 3。但我的问题仍然是一样的。在回调函数中,我是muta在每次迭代中设置数组以包含更多元素。我不认为方法签名或参数不是引用与此行为有任何关系。范围是如何存储的。我的意思是它存储在map函数的范围内还是全局范围内?@ExpertNoob它由
.map()的实现在内部维护
我还在调试控制台中看到“arr”在“closure”中。你能解释一下这是否与此行为有关。我认为closure(由arrow函数创建的环境)与此问题中的行为无关。您需要知道的是,
map
将函数应用于自身的每个元素并返回结果。
map
的规范没有指定它是如何做到这一点的,理解规范(即它应该如何表现)可能更有用它是否对性能有任何影响?使用map而不是forEach或for of。新创建的数组是否占用内存,即使我们没有像原始问题中那样分配它?它是否对性能有任何影响…嗯,我不确定,我们必须在orde中执行一些基准测试r来度量它,但这里有一个。新创建的数组会占用内存吗,即使我们没有分配它(…)?…好吧,如果你根本不使用这个值,它应该被垃圾收集(以防它在某个点占用一些内存,在内部由
map
函数),所以,不,它不应该占用内存。