这种抽象重复是如何工作的?

Vic*_*sto 2 javascript function

自从梦想成为一名优秀的JS开发人员以来,我正在阅读一些Javascript内容。我有点知道如何使用基础知识来满足我的PHP需求,但是仍然存在一些疑问。

我看到了一些例子,并得到了:

function repeat(n, action) {
   for (let i = 0; i < n; i++) {
      action(i);
   }
}

let labels = [];

repeat(5, i => {
   labels.push(`Unit ${i + 1}`);
});

console.log(labels);
Run Code Online (Sandbox Code Playgroud)

因此,如果需要,我可以使用它来重复一些基本功能。理解了,但是在另一种情况下,我可以使用相同的功能并使用不同的方法。

如果我想传递一个函数,为什么变量i变成计数器/迭代器?

我一直都在使用它,但仍然不知道它是如何工作的,因此在迫切需要时我无法使用它。

mis*_*nry 5

i没有成为迭代器。在代码中,您使用的是es6速记符号来描述函数。i是该函数的唯一参数。

i => {
   labels.push(`Unit ${i + 1}`);
});
Run Code Online (Sandbox Code Playgroud)

是相同的

function(i){
  labels.push(`Unit ${i + 1}`);
} 
Run Code Online (Sandbox Code Playgroud)

请在本参考中以速记符号查看更多信息

编辑:要回答您的评论“添加了什么”,必须repeat(n, action)更仔细地看一下该函数。i在两种情况下使用它也可能会使您感到困惑,因此我将重写该功能以帮助您理解。此函数使用for循环从0迭代到n

for (let idx = 0; idx < n; idx++) {
   action(idx);
}
Run Code Online (Sandbox Code Playgroud)

并使用当前的for循环索引调用该动作idx。因此,以您为例:

Iteration 0: action(0) -> labels.push(`Unit ${0 + 1}`);
Iteration 1: action(1) -> labels.push(`Unit ${1 + 1}`);
Iteration 2: action(2) -> labels.push(`Unit ${2 + 1}`);
Iteration 3: action(3) -> labels.push(`Unit ${3 + 1}`);
Iteration 4: action(4) -> labels.push(`Unit ${4 + 1}`);
Run Code Online (Sandbox Code Playgroud)

请注意,repeatof的声明i在其函数体中是局部的,就像$ {i + 1}单元中的i在它的函数体中局部的一样。这两个值在内存中没有引用相同的值,可以像我在解释中一样重命名i => { labels.push(); }i