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