.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().