涉及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);
})();
问题:
- IIFE是不是在全局
myVar
之前先吊顶了?
1a.如果是,它是否在声明全局 myVar
之前执行?
- 在 IIFE 中,我首先得到
undefined
,然后是 bar
。 IIFE的幕后执行顺序是什么?
- IIFE 是一个表达式,而不是一个语句,所以它没有被提升。
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();
我遇到了这段代码:
var myVar = 'foo';
(function() {
console.log('Original value was: ' + myVar);
var myVar = 'bar';
console.log('New value is: ' + myVar);
})();
问题:
- IIFE是不是在全局
myVar
之前先吊顶了? 1a.如果是,它是否在声明全局myVar
之前执行? - 在 IIFE 中,我首先得到
undefined
,然后是bar
。 IIFE的幕后执行顺序是什么?
- IIFE 是一个表达式,而不是一个语句,所以它没有被提升。
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();