Используя созданную вами функцию, всегда будет возвращаться: contacts[x][prop];
или "No such property"
, и эта строка return "No such contact";
никогда не будет выполнена, Почему?
Путем вложениядва оператора if
, новый оператор if
, который будет возвращаться либо: contacts[x][prop];
, если он проверяется на true
, либо "No such property"
, если он проверяется на false
и, следовательно, эта строка больше не будет выполняться /доступно, даже если условие contacts[x].firstName === name
соответствует false
.И именно поэтому используются два оператора if
: первый возвращает "No such contact";
, если он false
(даже без оператора else
, поскольку в первом операторе if
ничего не будет выполнено, если он проверяется наfalse
конечно, и, таким образом, функция переходит на следующую строку после того оператора if
, который return "No such contact";
)
Просто: ваша функция вернет "No such property"
дажеесли contacts[x].firstName === name
равно falsy
.
Вот фрагмент для иллюстрации:
// some dummy values just for the demo !
var contacts = [
{
firstName: "ths",
lastName: "sakh"
},
{
firstName: "firstname",
lastName: "lastname"
}
];
/**
* The modified function
**/
var r = (function test(name, prop) {
for (var x = 0; x < contacts.length; x++) {
if (contacts[x].firstName === name && contacts[x].hasOwnProperty(prop)) {
return contacts[x][prop];
} else {
return "No such property";
}
}
return "No such contact";
})("Wrong Name!", "firstName");
console.log('The modified function returned: "' + r + '" instead of return "No such contact"');
/**
* The original function
**/
var r = (function test(name, prop) {
for (var x = 0; x < contacts.length; x++){
if (contacts[x].firstName === name) {
if (contacts[x].hasOwnProperty(prop)) {
return contacts[x][prop];
} else {
return "No such property";
}
}
}
return "No such contact";
})("Wrong Name!", "firstName");
console.log('The original function returned: "' + r + '" and that\'s what should be returned.');
Надеюсь, я подтолкнул вас дальше.
Ps: не паникуйте по синтаксису var r = (function(x, y){...}(arg1, arg2)
это IIFE
(он же (Immediately Invoked Function Expression)
). Узнайте больше об этом.