Вопрос возникает на счёт данного утверждения: При помощи call можно легко взять метод одного объекта, в том числе встроенного, и вызвать в контексте другого.
Это называется «одалживание метода» (на англ. method borrowing).
Вопрос: В примере ниже демонстрируется method borrowing. Но где здесь работа метода call()? Ведь в коде демонстрируется изменение контекста вызова this, который находится внутри метода join().
PS: или же когда мы говорим call, мы не имеем ввиду способ изменения контекста за счёт вызова obj.call(), а просто имеем ввиду умышленное изменение контекста вызова ф-ции с this?
function printArgs() {
arguments.join = [].join; // одолжили метод (1)
var argStr = arguments.join(':'); // (2)
alert( argStr ); // сработает и выведет 1:2:3
}
printArgs(1, 2, 3);
Ответ найден: действительно, в данном примере метод call() при methoв borrowing не играет. Но в примере выше приведён способ опасного использования MB, в результате которого у объекта arguments мог быть перезаписан собственный join()(если бы он у него был). Безопасное использование MB предполагает использование метода call(), как в примере ниже:
function printArgs() {
var join = [].join; // скопируем ссылку на функцию в переменную
// вызовем join с this=arguments,
// этот вызов эквивалентен arguments.join(':') из примера выше
var argStr = join.call(arguments, ':');
alert( argStr ); // сработает и выведет 1:2:3
}
printArgs(1, 2, 3);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты