我有这个代码。请帮助我理解它的流程。
<script>
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick?
});
</script>
首先,我看到eachName
变量无处定义。它是如何工作的?
其次,我什么都不懂。请帮助我。
修改
我不了解功能(自主)部分。
答案 0 :(得分:3)
forEach()
对可迭代对象进行操作,即此处的数组。
它将回调函数作为参数Array.forEach(<callback function>)
对Array
每次调用该函数时,正在操作的当前元素都可用作回调函数中的第一个参数。
index
中当前元素的Array
可用作第二个参数
Array
本身可用作第三个参数。
Array.forEach(
function(currentElement, indexOfCurrentElement, Array){
//do whatever you want with currentElement, indexOfCurrentElement, Array
}
)
答案 1 :(得分:2)
我是一个“新手”,我也很困惑为什么会这样。也许出于不同的原因,但也许这对任何正在看这个的人都有帮助 - 我在一个匿名函数的解释器中的Elegant Javascript上找到了相同的代码。这个问题与这里函数的匿名性无关。花了一些看看规格,看看为什么它吐了出来的东西......最简单的解释:
1)forEach是一种仅用于数组的特殊方法。 (令人费解,但这里没有列出方法:http://www.w3schools.com/jsref/jsref_obj_array.asp - 完整的列表在哪里?)
2)...但是,而不是像传递数字或字符串的函数那样,forEach期望在其()s中给它一个函数。它想要宣布的方式是:
arrayName.forEach( someFunction(var1, var2, var3) { WHATEVER CODE HERE } )
2b)它也不必是一个匿名函数 - 你可以在其他地方声明一个函数并将其传递给它!换句话说:
sFunk = someFunction(var1, var2) { CODE! };
arrayName.forEach(sFunk);
3)理解代码工作原理的关键在于弄清楚它在哪里拉“eachName”和“index”的值......对吗?当forEach遍历数组中的所有项时,它每次都执行一个函数。该函数可以按以下顺序从数组中提取三个参数:
所以如果你有一个像:
这样的数组var peaches = ['georgia', 'crab']
你要求每个人打印出三个值:
peaches.forEach( function(a,b,c) { console.log(a); console.log(b); console.log(c); })
你会看到:
佐治亚
0
['georgia','crab']
蟹
1
['georgia','crab']
在你的控制台中。
有关详细信息,请查看此处: https://msdn.microsoft.com/en-us/library/ff679980(v=vs.94).aspx
答案 2 :(得分:1)
符号eachName
定义 - 它是回调函数的参数。 index
也是如此。
运行时为数组的每个元素调用一次函数。它传入元素值,索引和数组本身。 (你的回调函数会忽略第三个参数,没问题。)
JavaScript数组索引从零开始,这就是console.log()
行将1
添加到索引值的原因。
complete version of what .forEach()
does is pretty long,但这里有一个显着缩写(和出于教学原因的错误)版本:
Array.prototype.forEach = function(fn) {
for (var i = 0; i < this.length; ++i)
if (this[i] !== undefined) fn(this[i], i, this);
};
运行时遍历数组并为每个元素调用一次回调函数。
答案 3 :(得分:1)
在JavaScript中,函数是第一类值。可以在任何值的情况下使用函数。请考虑以下代码(基于您的代码):
var print = function(eachName, index) {
console.log(index + 1 + ". " + eachName);
}
function print2(eachName, index) {
console.log(index + 1 + ". " + eachName);
}
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName);
});
friends.forEach(print);
friends.forEach(print2);
print()
和print2()
的前两个函数定义就是这样 - 然后可以像您预期的那样调用它们(即print("Mike", 1
)。
代码之所以:
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName);
});
在forEach()
的参数列表中定义的函数是因为您可能会使用此函数一次 - 对friends
数组的元素起作用。如果您有多个要执行类似操作的数组,则可能会将其定义为上面的print()
或print2()`。
On Array.forEach()
- 此方法需要一个函数作为参数。这与大多数命令式语言(Java,C#等)不同。在我的示例代码中,当friends.forEach(print)
被调用时,foreach
会在print
的每个元素上调用friends
。
运行此代码可以证明这一点:
function print3(element, index, array) {
console.log("print3() called");
console.log(element);
console.log(index);
console.log(array);
}
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(print3);
输出:
print3() called
Mike
0
["Mike", "Stacy", "Andy", "Rick"]
print3() called
Stacy
1
["Mike", "Stacy", "Andy", "Rick"]
print3() called
Andy
2
["Mike", "Stacy", "Andy", "Rick"]
print3() called
Rick
3
["Mike", "Stacy", "Andy", "Rick"]