丟擲問題:
今天群友提出了乙個問題,看題:
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的值呢。這裡只提到函式呼叫模式,和方...