Почему «this» внутри функций, определенных и переданных IIFE, ссылается на саму функцию?

1

Отказ от ответственности: меня предупредили, что этот вопрос может быть отклонен. Я был бы признателен, если бы вы этого не сделали, - я попросил своего преподавателя на курсе Javascript для объяснения, и он не знал, поэтому я подумал, что спрошу здесь...

Я пытаюсь обернуть мою голову вокруг this и читал Кайл Симпсон, но столкнулся случай, я не понимаю.

Как я понимаю, когда вы вызываете функцию внутри другой функции, если функция называется "автономной" (см. Симпсон здесь: " Не знаете JS: это и прототипы объектов"), то this должно быть Window (или undefined если оно strict режим)

var fn = function globo () { console.log(this);};

function calling(called) {

console.log(called());

}
calling(fn); // "Window" or "undefined"

но если вы передадите аналогичную функцию IIFE, вы получите любопытный результат

 function calling(called) {

    console.log(called());

    }(function globo () { console.log(this);}); // [Function: globo]

Кажется, это редкий случай, когда this ссылка ссылается на вызываемую функцию, а не на "вызывающую" или по умолчанию, где она была определена.

Любая идея, что здесь происходит?

  • 4
    « Когда вы вызываете функцию внутри другой функции, это берет ее область, из которой она была определена. » Нет, вам понадобится функция стрелки для достижения этой цели. Также обратите внимание, что второй фрагмент не является IIFE.
  • 2
    Я получаю window используя ваш IIFE, а не globo . Кстати, в вашем IIFE отсутствуют первые парены.
Показать ещё 1 комментарий
Теги:
this
iife

1 ответ

7
Лучший ответ

На самом деле это не IIFE. В способе, которым вы написали, вы в основном определили функцию, calling, которую вы никогда не вызываете, а затем другую функцию globo, которую вы также никогда не вызываете. Если вы выполните этот код в консоли, вы получите globo как результат, так как это значение вашего последнего выражения - поскольку вы использовали скобки, это не объявление функции.

Вы можете дважды проверить запуск этого кода:

 function calling(called) {
    console.log('foo');
 }(function globo () {});

У вас будет тот же результат.

IIFE был бы:

 (function calling(called) {
    console.log(called());
 })(function globo () { console.log(this)});

Где, действительно, this возвращает Window (или undefined).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню