这段代码来自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'包含两个参数的值?谁能解释一下这是怎么发生的?
提前致谢。 卡洛斯。
答案 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>