書寫一個自運行函數的坑

拋出問題:
今天羣友提出了一個問題,看題:

    let b = 1;
    (function b() {
        b = 9;
        console.log(b)
    })();

請問,b打印的值是什麼?
根據經驗來說,大家明眼一看,肯定感覺打印的值是9,因爲在上面就賦值了,打印的肯定就是9。可惜事與願違,這個打印的竟然是函數function b。當場直接矇蔽,下面,我們來解析一下爲什麼是這個結果。

這個問題出就出在了自運行函數IIFEIIFE: Immediately Invoked Function Expression身上,IIFE的出現是爲了彌補JS在scope方面的缺陷:JS只有全局作用域(global scope)、函數作用域(function scope),從ES6開始纔有塊級作用域(block scope)。
所以說,IIFE的目的是爲了隔離作用域,防止污染全局命名空間。

知道了這一點,既然IIFE隔離了作用域,而函數b則作爲了一個單獨作用域聲明的一個函數,相當於是var b = function這樣子,那既然這樣,重點來,爲什麼我在函數內部賦值b爲9, 下面打印的應該是9啊,不應該是fucntion纔是。

帶着這個問題,我們將代碼修改一下

    let b = 1;
    (function b() {
        'use strict'
        b = 9;
        console.log(b)
    })();
    console.log(b);

修改爲使用嚴格模式,你就會發現在調試框出現這樣一個報錯:

(index):63 Uncaught TypeError: Assignment to constant variable.

這句話啥意思,就是你不能修改一個通過const定義的變量的值,這就相當於IIFE其實是講函數b通過

const b = function

的方式進行聲明的,const的聲明的方式是在es6中添加的,如果修改就會報錯。從這裏我就明白了IIFE一起獨特的原理,但是,推薦大家這種方式千萬不要用到項目當中,利人利己,社會和諧。

引用:說一說JS的IIFE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章