書寫乙個自執行函式的坑

2021-09-29 16:10:24 字數 1035 閱讀 1141

丟擲問題:

今天群友提出了乙個問題,看題:

let b = 1;

(function 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() )();

console.log(b);

修改為使用嚴格模式,你就會發現在除錯框出現這樣乙個報錯:

(index):63 uncaught typeerror: assignment to constant variable.
這句話啥意思,就是你不能修改乙個通過const定義的變數的值,這就相當於iife其實是講函式b通過

const b = function
的方式進行宣告的,const的宣告的方式是在es6中新增的,如果修改就會報錯。從這裡我就明白了iife一起獨特的原理,但是,推薦大家這種方式千萬不要用到專案當中,利人利己,社會和諧。

引用:說一說js的iife

rtrim函式的乙個坑

簡述一下今天遇到的問題 在我的 裡面有如下 段 header content type text html charset utf8 echo rtrim 威 本來的預想是輸出 威 然而事與願違,輸出了幾個亂碼。這是為什麼呢?容我細細道來。首先要知道rtrim函式的功能,它的第二個引數是乙個stri...

書寫乙個儲存過程

delimiter console 轉換為 定義儲存過程 引數 in輸入引數 out輸出引數 row count 返回上一條修改型別sql delete,insert,update 的影響條數 row count 0 未修改資料 0 表示sql出錯 0 表示修改了行數 create procedur...

乙個函式呼叫模式的小坑

昨天覆習了下閉包,遇到乙個思考題,糾結了好久,才發現自己基礎原來那麼差。貼出來 var name the window var object alert object.getnamefunc the window我掉進了閉包的坑里,為啥返回的函式就不能維持this的值呢。這裡只提到函式呼叫模式,和方...