我正在学习JavaScript,对下面的练习有点困惑。我确实需要创建一个过滤器,接受另一个函数作为排序方法。我有点不明白的是for loop
是如何将value
传递给x
的。你能解释一下吗?
function filter(arr, func) {
var result = [];
for (var i = 0; i < arr.length; i++) {
var value = arr[i];
if (func(value)) {
result.push(value);
}
}
return result
}
function inBetween(a, b) {
return function(x) {
return a <= x && x <= b;
}
}
function inArray(arr) {
return function(x) {
console.log(x)
return arr.indexOf(x) != -1;
}
}
var arr = [1, 2, 3, 4, 5, 6, 7];
alert(filter(arr, function(a) {
return a % 2 == 0
})); // 2,4,6
alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6
alert( filter(arr, inArray([1, 2, 10])) ); // 1,2
我将以这一行为例:
filter(arr, inArray([1, 2, 10])) );
inArray是用arr = [1, 2, 10]
调用的。
它返回以下(匿名)函数,用于特定的arr:
function (x) {
return arr.indexOf(x) != -1;
}
因此,原来的线路现在可以想象为:
filter(arr, function (x) {
return [1, 2, 10].indexOf(x) != -1;
});
现在调用过滤器,并将函数设置为该匿名函数。以下代码调用该函数:
if (func(value)) {
result.push(value);
}
因此,当这个func被调用时,这实际上意味着上面的匿名函数被调用,并且参数x在调用时被设置为值。这就像任何其他函数调用一样,函数的参数获取实际调用中参数的值。
您的filter函数接受要筛选的数组,以及执行筛选的函数。本部分:
for (var i = 0; i < arr.length; i++) {
var value = arr[i];
if (func(value)) { //here, you invoke the function on the array's values
result.push(value);
}
}
例如,如果我们看inBetween(3, 6)
函数,它是这样的:
return function(x) {
return 3 <= x && x <= 6;
}
(如果你不理解这一部分,请阅读更多关于闭包的内容)
因此,现在这个函数只是一个接受值并返回true/false的函数,不管它是否在3&6.
使用上面的函数,您最终可以调用数组的每个值(1、2、3…7)。
您列出的所有其他函数也是如此。
在行中:
filter(arr, inBetween(3, 6))
您不是在"传递函数",而是传递函数调用的结果。结果是另一个(匿名/未命名)函数。
从此行:
function filter(arr, func) {
我们知道作为参数传递给filter
的函数名为func
,那么:
if (func(value)) {
执行此功能。
在JavaScript中,函数和其他对象一样只是一个对象。要区分"函数对象引用"one_answers"函数调用",可以查找()
。
inBetween
是函数对象引用,inBetween(x, y)
表示调用该函数。
匿名函数可以定义、分配给变量,也可以作为参数传递。它也可以在定义后立即执行:
function() {
alert("called!");
}();
不过,对于刚接触JavaScript的人来说,这可能看起来很奇特。