涉及IIFE的吊装单,具体示例

Hoisting order with IIFE involved, specific example

我遇到了这段代码:

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的幕后执行顺序是什么?
  1. IIFE 是一个表达式,而不是一个语句,所以它没有被提升。
  2. var myVar 在 IIFE 中被提升到函数作用域的顶部,但赋值不是。以下是等价的:

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

Patrick Roberts 的回答非常好,但我想澄清一点,这里没有任何特定于 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();