Функция как объект: свой контекст вызова у функции

Может ли функция сама для себя быть контекстом вызова (т.е. чтобы this функции указывал не на глобальный объект, а на саму функцию)? И если "да", то как это можно реализовать?


Ответы (2 шт):

Автор решения: Pavel Grishaev

Может, вот пример:

function someFunc(){
  console.log( this === someFunc );
}

someFunc.call( someFunc );

Ещё пример, где функция сама задаёт свой this, вызывая себя рекурсивно один раз:

function myFunc(){
  // Обеспечиваем this === myFunc
  if( this !== myFunc ) return myFunc.call(myFunc);
  
  // Тут нужные действия пишем...
  console.log('123');
  // ... например проверяем this
  console.log( this === myFunc );
}

myFunc();

→ Ссылка
Автор решения: nörbörnën

Реализовать можно через bind

Метод bind() создаёт новую функцию, которая при вызове устанавливает в качестве контекста выполнения this предоставленное значение. В метод также передаётся набор аргументов, которые будут установлены перед переданными в привязанную функцию аргументами при её вызове.

Смотрите btnfn2 в примере:

function fun() {
  console.log(this.xx)
}
fun.xx = Math.random();
function btnfn1() {
  fun();
}
function btnfn2() {
  const fn = fun.bind(fun);
  fn();
}
<button onclick="btnfn1()">btn1</button>
<button onclick="btnfn2()">btn2</button>

С тем же эффектом можно вызвать функцию через call и apply.

→ Ссылка