摘要:提供了同時(shí)解決這兩個(gè)問題的方案以上這種模式稱為立即執(zhí)行函數(shù)表達(dá)式。塊作用域不應(yīng)該完全作為函數(shù)作用域的替代方案,兩種功能應(yīng)該同時(shí)存在。
函數(shù)作用域
為了隱藏內(nèi)部實(shí)現(xiàn),可以通過在任意代碼片段外部添加包裝函數(shù),但是這并不理想,因?yàn)楸仨毬暶饕粋€(gè)具名函數(shù),意味著這個(gè)函數(shù)名稱本身會(huì)污染函數(shù)所在的作用域;同時(shí)必須通過顯式地調(diào)用函數(shù)才能運(yùn)行其中的代碼。
*:區(qū)分函數(shù)聲明和表達(dá)式最簡單的方法是看function關(guān)鍵字出現(xiàn)在聲明中的位置。如果function是聲明中的第一個(gè)詞,那么就是一個(gè)函數(shù)聲明,否則就是一個(gè)函數(shù)表達(dá)式。
JS提供了同時(shí)解決這兩個(gè)問題的方案:
var a=2; (function foo(){ var a=3; console.log(a);//3 })(); console.log(a);//2
以上這種模式稱為立即執(zhí)行函數(shù)表達(dá)式(IIFE)。
有一個(gè)改進(jìn)的形式:
var a=2; (function foo(){ var a=3; console.log(a);//3 }());//調(diào)用的括號包含在用來包裝的()里 console.log(a);//2
兩種形式在功能上是一致的。
IIFE有一個(gè)進(jìn)階用法:把它們當(dāng)作函數(shù)調(diào)用并傳遞參數(shù)進(jìn)去。
var a=2; (function IIFE(global){ var a=3; console.log(a);//3 console.log(global.a);//2 })(window); console.log(a);//2
IIFE還有一種變化的用途是倒置代碼的運(yùn)行順序,將需要運(yùn)行的函數(shù)放在第二位。
var a=2; (function IIFE(def){ def(window); })(funtion def(global){ var a=3; console.log(a);//3 console.log(global.a);//2 })塊作用域 let
只要聲明是有效的,在聲明中的任意位置都可以使用{...}括號來為let創(chuàng)建一個(gè)用于綁定的塊。
var foo=true; if(foo){ {//顯式的塊 let bar=foo*2; console.log(bar);//2 } console.log(bar);//ReferenceError } console.log(bar);//ReferenceError
**:let循環(huán):for的循環(huán)頭部使用let,不僅將i綁定到for的塊中,事實(shí)上它將其重新綁定到了循環(huán)的每個(gè)迭代中,確保使用上一個(gè)循環(huán)迭代結(jié)束時(shí)的值重新進(jìn)行賦值。
*:塊作用域不應(yīng)該完全作為函數(shù)作用域的替代方案,兩種功能應(yīng)該同時(shí)存在。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95830.html
摘要:吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊要說閉包,要先說下詞法作用域。閉包兩個(gè)作用通過閉包,在外部環(huán)境訪問內(nèi)部環(huán)境的變量。閉包使得函數(shù)可以繼續(xù)訪問定義時(shí)的詞法作用域。 閉包是真的讓人頭暈啊,看了很久還是覺得很模糊。只能把目前自己的一些理解先寫下來,這其中必定包含著一些錯(cuò)誤,待日后有更深刻的理解時(shí)再作更改。 吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊…… 要說閉包,要先說下詞法...
摘要:如果是聲明中的第一個(gè)詞,那么就是一個(gè)函數(shù)聲明,否則就是一個(gè)函數(shù)表達(dá)式。給函數(shù)表達(dá)式指定一個(gè)函數(shù)名可以有效的解決以上問題。始終給函數(shù)表達(dá)式命名是一個(gè)最佳實(shí)踐。也有開發(fā)者干脆關(guān)閉了靜態(tài)檢查工具對重復(fù)變量名的檢查。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗(yàn)豐富的 Ja...
摘要:理解作用域在引擎看來是兩個(gè)完全不同的聲明。在循環(huán)中使用閉包閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。回到我們上面說的在自己定義的作用域以外的地方執(zhí)行,這里聲明的是全局變量,使用全局變量不構(gòu)成閉包。 第一章:作用域是什么 程序中變量存儲在哪里,需要是怎么找到它,這就需要設(shè)計(jì)一套存儲以及能方便的找到它的規(guī)則,這個(gè)規(guī)則就是作用域 編譯原理 JavaScript 是一門編譯語言,它與傳統(tǒng)編譯語言...
摘要:寫在前面對于一個(gè)前端開發(fā)者,應(yīng)該沒有不知道作用域的。欺騙詞法作用域有兩個(gè)機(jī)制可以欺騙詞法作用域和。關(guān)于你不知道的的第一部分作用域和閉包已經(jīng)結(jié)束了,但是,更新不會(huì)就此止住未完待續(xù) 這是《你不知道的JavaScript》的第一部分。 本系列持續(xù)更新中,Github 地址請查閱這里。 寫在前面 對于一個(gè)前端開發(fā)者,應(yīng)該沒有不知道作用域的。它是一個(gè)既簡單有復(fù)雜的概念,簡單到每行代碼都有它的影子...
摘要:詞法作用域定義在詞法階段的作用域由你在寫代碼時(shí)將變量和塊作用域?qū)懺谀膩頉Q定的,因此當(dāng)詞法分析器處理代碼時(shí)會(huì)保持作用域不變。欺騙詞法作用域在詞法分析器處理過后依然可以修改作用域。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗(yàn)豐富的 JavaScript 開發(fā)者,如果沒...
閱讀 2179·2021-11-25 09:43
閱讀 2261·2021-11-24 09:39
閱讀 1555·2021-11-22 12:02
閱讀 2992·2021-11-17 09:33
閱讀 3418·2021-11-15 11:38
閱讀 2744·2021-10-13 09:40
閱讀 1075·2021-09-22 15:41
閱讀 1694·2019-08-30 10:58