Порядок подъема с участием IIFE, конкретный пример - PullRequest
0 голосов
/ 21 ноября 2018

Я наткнулся на этот код:

var myVar = 'foo';

(function() {
  console.log('Original value was: ' + myVar);
  var myVar = 'bar';
  console.log('New value is: ' + myVar);
})();

Вопросы:

  1. Поднимается ли IIFE на вершину перед глобальным myVar?1a.Если это так, выполняется ли оно до того, как объявлено глобальное myVar?
  2. В IIFE я получаю undefined сначала, а bar второй.Каков закулисный порядок исполнения во IIFE?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ответ Патрика Робертса превосходен, но я хотел кое-что прояснить, здесь нет ничего специфического для IIFE, все функции работают одинаково, независимо от того, вызваны они немедленно или нет

var myVar = 'foo';

// f1 : creates a variable inside the scope with the same name
function f1 () {
    console.log(myVar);   // Logs undefined
    var myVar = 'hi';
}

// f2 is the same as f1
function f2 () {
    var myVar;
    console.log(myVar);   // Logs undefined
    myVar = 'hi';
}

// f3 declares before logging
function f3 () {
    var myVar = 'hullo';
    console.log(myVar);   // Logs the inner value of the variable
}

function logOuterVar () {
    console.log(myVar);   // Logs the global var
}

f1();
f2();
f3();
logOuterVar();
0 голосов
/ 21 ноября 2018
  1. IIFE является выражением, а не утверждением, поэтому нет, оно не поднимается.
  2. var myVar внутри IIFE поднимается в верхнюю часть области действия функции, но назначение не,Следующее эквивалентно:

(function(){
   var myVar;
   console.log('Original value was: '+ myVar);
   myVar = 'bar';
   console.log('New value is: ' + myVar);
})();
...