.call()/.apply() с NO параметрами VS, просто вызывающими функцию с() скобкой
Я видел, как это делалось по-другому в коде, но есть ли какая-либо польза или причина для выполнения (пустых параметров) .call/.apply по регулярному ().
Это, конечно, упрощенный пример
var func = function () { /* do whatever */ };
func.call();
func.apply();
ПРОСМОТРЕТЬ только простую скобку.
func();
Не видел никакой информации об этом в любом месте, я знаю, почему call/apply используются при передаче параметров.
Ответы
Ответ 1
Когда вы вызываете метод с func();
, переменная this
внутри метода указывает на объект window
.
Где, как при использовании call (...)/применить (...) первый параметр, переданный вызову метода, становится this
внутри метода. Если вы не передаете никакие аргументы /pass null или undefined, то this
будет стать глобальным объектом в нестандартном режиме.
Ответ 2
Да, в некоторых случаях есть важное различие. Например, работа с обратными вызовами. Предположим, у вас есть класс с конструктором, который принимает параметр callback
и сохраняет его под this.callback
. Позже, когда этот обратный вызов вызывается через this.callback()
, внезапно внешний код получает ссылку на ваш объект через this
. Это не всегда желательно, и лучше/безопаснее использовать this.callback.call()
в таком случае.
Таким образом, внешний код будет undefined
как this
и не будет пытаться изменить ваш объект случайно. И надлежащим образом написанный обратный вызов не будет затронут этим использованием call()
любом случае, поскольку они будут обеспечивать обратный вызов, определенный как функция стрелки или связанная функция (через .bind()
). В обоих случаях обратный вызов будет иметь свой собственный, соответствующий этому, не затронутый call()
, поскольку стрелки и связанные функции просто игнорируют значение, заданное apply()/call()
.