numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(i){
return (i > 2);
});
我不明白这是如何运作的。如果我将i省略为函数参数,它会破坏函数,但是i不依赖于任何东西,为什么它需要在那里呢?
答案 0 :(得分:25)
.filter
(Array.prototype.filter
)使用3个参数调用提供的函数:
function(element, index, array) {
...
element
是调用的特定数组元素。index
是元素的当前索引array
是要过滤的数组。您可以使用任何或所有参数。
在您的情况下,i
引用element
并在您的函数正文中使用:
function(i){
return (i > 2);
}
换句话说,“element
大于2”的过滤元素。
答案 1 :(得分:3)
i是在闭包内部时对集合中当前对象的引用。它可以被命名为任何东西,因为它只是一个变量,但是它必须在闭包内具有相同的名称。而不是使用function(){}
,您可以使用回调,这就是filter
的设计方式。
引用是由.filter
的定义隐式完成的,您可以在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/ff679973(v=vs.94).aspx
答案 2 :(得分:0)
i
实际上非常重要。它告诉过滤器函数有关它所作用的元素的信息。事实上它在这里使用(i > 2)
。
这可以保留值大于2的元素。
答案 3 :(得分:0)
i
是您要提供给.filter()
的函数的形式参数。如果你没有插入它,函数将没有任何方式来引用它传递的参数(函数体内的i
将引用一些甚至可能没有定义的其他实体 - {{ 1}}是典型的。)
¹在技术上是谎言,但在本次讨论中认为是正确的
答案 4 :(得分:0)
确实是一个旧线程,但只是填写了未说明的内容。
括号中有程序员可以插入对您的特定程序有意义的变量名称。
如果您选择' i',大多数其他(初学者)程序员可能会想到'哦,我的意思是指数'。哪个是错的。
如果您使用一个参数而不是三个参数,我会选择' el'代表元素,或者如果你的数组包含苏打水,我选择'味道'。
答案 5 :(得分:0)
这是ES5表示法,也许如果您在ES6表示法中看到它,您将会理解为什么“ i”是必须的:
numbers.filter(i => i > 2);
必须始终使用变量来引用您在每次迭代中处理的数组项(在本例中为“ i”)。它必须作为参数传递给函数的入口点(在ES6中位于箭头之前)。