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

时间:2018-11-21 16:56:25

标签: javascript iife hoisting

我遇到了以下代码:

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 :(得分:2)

  1. IIFE是一个表达式,而不是一个语句,所以没有它。
  2. IIFE中的
  3. var myVar会提升到功能范围的顶部,但不会分配。以下是等效的:

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

答案 1 :(得分:1)

帕特里克·罗伯茨(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();