Отказ от ответственности: меня предупредили, что этот вопрос может быть отклонен. Я был бы признателен, если бы вы этого не сделали, - я попросил своего преподавателя на курсе 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
ссылка ссылается на вызываемую функцию, а не на "вызывающую" или по умолчанию, где она была определена.
Любая идея, что здесь происходит?
На самом деле это не 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
).
window
используя ваш IIFE, а неglobo
. Кстати, в вашем IIFE отсутствуют первые парены.