10
numbers = [1,2,3,4,5,4,3,2,1]; 
var filterResult = numbers.filter(function(i){
    return (i > 2);
});       

我不明白这是如何工作的。如果我省略 i 作为函数参数,它会破坏函数但 i 不与任何东西绑定,那么为什么它需要在那里?

4

6 回答 6

25

.filter( Array.prototype.filter) 使用 3 个参数调用提供的函数:

function(element, index, array) {
    ...
  • element是调用的特定数组元素。
  • index是元素的当前索引
  • array是被过滤的数组。

您可以使用任何或所有参数。

在您的情况下,i指的是element并且在您的函数体中使用:

function(i){
    return (i > 2);
}

换句话说, “大于 2 的过滤元素element” 。

于 2012-06-27T22:57:51.113 回答
3

i 是在该闭包内时对集合中当前对象的引用。它可以被命名为任何东西,因为它只是一个变量,但在闭包内必须具有相同的名称。function(){}您可以使用设计方式的回调,而不是使用filter

引用是通过定义隐式完成的.filter,您可以在此处阅读更多信息:http: //msdn.microsoft.com/en-us/library/ff679973 (v=vs.94).aspx

于 2012-06-27T22:55:20.353 回答
0

i其实非常重要。它告诉过滤器函数有关它所作用的元素的信息。事实上,它就在这里使用(i > 2)

这会保留值大于 2 的元素。

于 2012-06-27T22:54:21.433 回答
0

i是您提供给的函数的形式参数.filter()。如果您不插入它,该函数将没有任何方式¹来引用它正在传递的参数(i然后函数体内部将引用一些甚至可能没有定义的其他实体——window.i这很典型)。


¹这在技术上是一个谎言,但出于本讨论的目的,请认为这是真的

于 2012-06-27T22:56:38.647 回答
0

确实是一个旧线程,但只是填补了未说的内容。

括号在那里,程序员可以插入对您的特定程序有意义的任何变量名称。

如果您选择“i”,大多数其他(初学者)程序员可能会认为“哦,我的意思是索引”。这是错误的。

如果您使用一个参数而不是三个参数,我会选择“el”来表示元素,或者如果您的数组包含苏打水的味道,我会选择“味道”。

于 2014-06-28T17:29:16.443 回答
0

那是 ES5 表示法,也许如果你在 ES6 表示法中看到它,你就会明白为什么“i”是必须的:

numbers.filter(i => i > 2);

必须始终使用变量来引用您在每次迭代中处理的数组项(在本例中为“i”)。它必须作为参数传递给函数的入口点(在 ES6 中,在箭头之前)。

于 2019-04-18T17:27:08.997 回答