IIFE的变量作用域
下面代码会输出什么结果
(function test(){
test = 1;
console.log(test);
function fn(){
console.log("fntest");
}
})();
输出的结果
ƒ test(){
test = 1;
console.log(test);
function fn(){
console.log("fntest");
}
}
还是立即执行函数本身。 思考一下为什么,
-
主要考虑的还是立即执行函数的词法作用域,立即执行函数由2部分组成——第一部分是包围在圆括号运算符()里的函数(test),这个函数拥有独立的词法作用域。这不仅避免了外界访问此IIFE中的变量,而且不会污染全局作用域。第二部分再一次使用()创建了一个立即执行函数表达式,JavaScript引擎到此将直接执行函数。所以如果在这个立即执行函数之外调用test会报ReferenceError:test is not defined。
-
为什么test = 1会失效呢,因为在IIFE中test函数名相当于使用const关键字定义的,因此没有办法对一个常量在赋值,在strict mode下,直接TypeError类型的错误,这类错误跟数据类型有关;在non-strict mode下,会忽略对常量的赋值;