Вопрос возникает на счёт данного утверждения: При помощи 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);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок