对Array.prototype.some()的怀疑

时间:2017-01-26 18:44:21

标签: javascript json

这段代码来自freeCodeCamp挑战。它有效。但我需要一些澄清。在练习中,它是关于在调用 lookUp函数时读取json数组以提取给定 firstName 属性的值。另外,在读取它的值之前检查这样的属性。

contacts.some 声明回调功能(arg){...} 时,似乎'arg'已经知道'firstName'和'prop'调用lookUp函数时传递的参数。

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

function lookUp(firstName, prop) {
  // Only change code below this line
  var answer = "No such contact";
  contacts.some(function(arg) {
    if (arg.firstName === firstName && arg.hasOwnProperty(prop) === true) {
      answer = arg[prop];
    } else if (arg.hasOwnProperty(prop) === false) {
      answer = "No such property";
    }
  });
  return answer;
  // Only change code above this line
}

// Change these values to test your function
lookUp("Kristian", "lastName");

我不明白魔法在哪里。为什么'arg'包含两个参数的值?谁能解释一下这是怎么发生的?

提前致谢。 卡洛斯。

1 个答案:

答案 0 :(得分:3)

写入的函数包含逻辑错误,这将阻止它执行它的设计。但是,我将特别提出有关回调如何在数组项中查看lookUp函数的参数和属性的问题。

在JavaScript中,在给定范围内定义的函数可以看到它们所在范围内的变量。例如:

var variable = 5;

function incrementVariable()
{
  variable++;
}

在此示例中,incrementVariable可以看到变量variable,即使它是在函数外部定义的。在此示例中,variable是全局的,但这可以在另一个函数内完成:

function doSomething()
{
  var variable = 5;

  function incrementVariable()
  {
    variable++;
  }

  ...
  incrementVariable();
  ...
}

函数的参数只是另一种类型的变量,例如:

function doSomething(variable)
{
  function incrementVariable()
  {
    variable++;
  }

  ...
  incrementVariable();
  ...
}

doSomething(5);

在您发布的lookUp函数中,contacts.some(..)的参数是在function函数中定义的lookUp,因此它可以“看到”lookUp的所有内容1}}函数本身可以看到,包括它的参数。

此类共享范围的技术术语是“闭包”。

回调函数的arg参数由some()函数本身正在执行的操作定义。对contacts数组中的每个元素调用一次回调。因此,例如,第一次回调在arg

中有这个
{
    "firstName": "Akira",
    "lastName": "Laine",
    "number": "0543236543",
    "likes": ["Pizza", "Coding", "Brownie Points"]
}

因此,回调可以看到firstName,lookUp的参数和arg.firstName,在这种情况下是字符串"Akira"。同样,如果prop"number",则arg[prop]引用该对象中的"number"属性,在这种情况下为"0543236543"。< / p>