這篇文章將為大家詳細講解有關JavaScript中關于作用域的詳細介紹,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
創新互聯基于成都重慶香港及美國等地區分布式IDC機房數據中心構建的電信大帶寬,聯通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業電信機房托管報價,主機托管價格性價比高,為金融證券行業服務器托管,ai人工智能服務器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業成都idc公司。幾乎所有的編程語言都有作用域的概念,那作用域到底指的是什么呢?作用域就是編程語言在定義變量時,變量如何存儲、變量如何訪問的一套規則,不同的編程語言的規則大同小異,接下來就來看看這套規則是怎么設定的
編譯原理
在傳統編譯語言中,在代碼執行之前都會有一個編譯過程:
和傳統編譯語言不太一樣,js的編譯和執行并不是分開執行,大多數情況都是編譯過程結束就會立刻執行,為了在短時間的編譯過程內達到較優性能,js引擎較一般編譯器更復雜,現在就讓來看js的編譯過程,簡單的以編譯var a = 2為例:
詞法作用域
作用域一般有兩種工作模型,第一種是被大多數編程語言所采用的詞法作用域,另外一種叫作動態作用域,如Bash腳本采用的就是動態作用域。詞法作用域就是定義在詞法階段的作用域,詞法作用域是由你在寫代碼時將變量和塊作用域寫在哪里來決定的,由變量定義位置決定,而動態作用域則是由變量使用的位置來決定的。下面來看個例子:
function foo(a) { var b = a * 2; function bar(c) { console.log(a, b, c) } bar(b * 3) } foo(2)
首先來分析一下這里一共存在幾個作用域?
接下來再來分析一下變量的查找過程,引擎執行console.log()需要查找a、b、c三個變量的引用,首先從最里面的bar()作用域開始找,引擎無法找到a,因此會再往上到foo()作用域中找,在這里找到了a,停止查找,對于b、c來說查找過程一樣。作用域查找始終從運行時最內層開始查找,逐級向外查找,直到遇見第一個匹配的變量為止。
函數作用域
函數作用域指的是屬于這個函數的全部變量都可以在整個函數的范圍內使用及復用,這是大家都知道的定義,但是函數作用域的存在到底有什么用呢?接下來就一起看看函數作用域的秒用。
隱藏內部實現
隱藏內部實現就是將變量和函數包裹在一個函數的作用域中,達到隱藏的目的,為什么要這么做呢?軟件設計中有一個非常有名的原則叫最小暴露原則,指最小限度暴露必要內容,而將其他內容都隱藏起來,比如模塊或對象的API設計。用函數作用域來包裹變量和函數來達到最小暴露原則,阻止外部直接訪問,來看下面的例子:
function doSomething(a) { b = a + doSomethingElse( a * 2 ); console.log( b * 3 ); } function doSomethingElse(a) { return a - 1; } var b; doSomething( 2 ); // 15”
在這段代碼中doSomethingElse和b應該是doSomething內部私有的,但是卻被暴露出來,這樣會導致以預期之外的形式被使用,產生意料之外的結果,更合理的設計應該是將這些私有的內容隱藏在doSomething內部,例如:
function doSomething(a) { function doSomethingElse(a) { return a - 1; } var b; b = a + doSomethingElse( a * 2 ); console.log( b * 3 ); } doSomething( 2 );
這樣b和doSomethingElse都無法從doSomething外部訪問,但是這樣也會存在一些問題,首先在全局作用域中聲明了doSomething函數,污染了全局作用,其次,必須通過顯示調用才能執行,那么有沒有什么辦法既不會污染作用域也不需要調用就可以自執行呢?答案就是函數表達式,看下面的例子:
(function doSomething(a) { function doSomethingElse(a) { return a - 1; } var b; b = a + doSomethingElse( a * 2 ); console.log( b * 3 ); })(2)
首先來看(function doSomething(){})這是一個函數表達式,和函數聲明不同的是用括號包起來的,然后再(function doSomething(a){})()調用傳值,這樣既能自執行也不會污染作用域,社區給這種用法定義了一個術語:IIFE,代表立即執行函數表達式
塊作用域
除JavaScript外很多編程語言都支持塊作用域,盡管你可能寫過很偽塊作用域形式的代碼,最常見的就是for循環:
for(var i=0; i<10; i++) { console.log(i) }
寫這段代碼通常是希望變量i在循環內部使用,但是實際上i會被綁定到外部作用域中,要確保沒有在作用域的其他地方意外使用i,就只能依靠自覺,這時候塊級作用域就顯得尤為有用,ES6改變了現狀,引入了新的let、const關鍵字,let關鍵字可以將變量綁定到所在的任意作用域中,也就是let為其聲明的變量隱式地創建了作用域:
for(let i=0; i<10; i++) { console.log(i) } console.log(i) // ReferenceError
這時候i就只會在for循環的內部有效
關于JavaScript中關于作用域的詳細介紹就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞標題:JavaScript中關于作用域的詳細介紹-創新互聯
網頁地址:http://m.newbst.com/article0/dpedio.html
成都網站建設公司_創新互聯,為您提供動態網站、自適應網站、響應式網站、企業建站、網站制作、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯