立即执行函数IIFE

188 阅读1分钟

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下,会忽略对常量的赋值;