Я пытаюсь понять цель использования call()
. Я прочитал этот пример о том, для чего он используется, и собрал примеры из Mozilla, а именно:
var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (var i = 0; i < animals.length; i++) {
(function(i) {
this.print = function() {
console.log('#' + i + ' ' + this.species
+ ': ' + this.name);
}
this.print();
}).call(animals[i], i);
}
Я знаю, что их пример предназначен только для демонстрации, но я мог бы легко просто получить доступ к свойствам объекта непосредственно в цикле как таковом:
var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (var i = 0; i < animals.length; i++) {
console.log('#' + i + ' ' + animals[i].species + ': ' + animals[i].name);
}
От этого я в замешательстве. Я до сих пор не вижу причины, по которой мне нужно было бы передавать другой this
контекст для call().
Кроме того, с этим примером Mozilla в функции .call(animals[i], i);
у меня есть два вопроса:
this
здесь - это массивanimals
. Я предполагаю, что вам нужно вызвать здесь, потому чтоanimals
в противном случае выходит за рамки внутренней анонимной функции?какова цель передачи индекса
i
в качестве второго аргумента в.call(animals[i], i);
?
Этот вопрос вызван следующим сегментом кода, который я пытался понять. Этот код предназначен для сбора всех внутренних значений из определенных интервалов в документе и их объединения. Почему мне нужно выполнить call
здесь, на карте? Это потому, что document.querySelectorAll
иначе не соответствует контексту?
console.log([].map.call(document.querySelectorAll("span"),
function(a){
return a.textContent;
}).join(""));
this
иi
для параметраi
. Было бы разумнее, если бы.print()
не вызывался напрямую, как в этом надуманном примере. - person Bergi   schedule 26.02.2015querySelectorAll
не возвращает массив. И именно поэтому вам НУЖНОcall
там. - person Bergi   schedule 26.02.2015