拋出問題:
今天羣友提出了一個問題,看題:
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