首页 > 解决方案 > 此过滤代码如何使用函数参数来填补给定计算中的空白?

问题描述

因此,我正在阅读这本名为“Eloquent JavaScript”的书,并且遇到了用于查找某些通过测试的元素的过滤器功能。代码如下:

filter(array, test) {
  let passed = [];
  for (let element of array) {
    // What exactly is test(element) in the if statement below?
    if (test(element)) {
      passed.push(element);
    }
  }
  return passed;
}

console.log(filter(SCRIPTS, script => script.living));
// → [{name: "Adlam", …}, …]

我的问题:声明范围内到底发生了if什么?它在书中说test填补了计算中的“空白”。我可以理解它被用作函数的返回值。但是,如果你的函数只返回,为什么你需要一个elementinside ?testtestscript.living

另外,如果答案是“因为您正在测试每个元素”,那么测试函数究竟是如何“检查”元素的?我希望我在问什么时说清楚了。感谢所有的帮助。

标签: javascript

解决方案


在 if 语句的范围内到底发生了什么?

test函数通过elementas 参数执行。这个事实也与你的下一个问题有关

如果您的测试函数只返回 script.living,为什么还需要在 test 中添加一个元素?

script => script.living

script只是参数的名称。此名称将替换为函数调用时收到的实际元素。因此,当if( test(element))被执行时,script被绑定到element并且被执行的实际指令是element.living.

因此,例如,假设电流element{name: "Adlam", living: true}。在这种情况下,test函数将返回true,因为元素的living属性设置为true。另一方面,如果元素是{name: John, living: false}test函数将返回false,因为living属性设置为false

走得更远一点

这里还发生了其他事情。Javascript具有所谓的FalsyTruthy值:

所以在上面的例子中,如果函数返回任何可能的值(, , , ...) ,if(test(element))子句中的代码将不会被执行。示例:。相反,如果函数返回任何值,则子句内的代码将被执行。例子:test(element)Falsyfalse0nullundefined{name: "Adlam", living: null}iftest(element)Truthy{name: "Adlam", living: 1}


推荐阅读