JavaScript 變數與函式宣告前置
JavaScript是自上而下按照一定的規則執行的。
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let a=1,b=2; let num; num=a+b; console.log(num);
程式碼執行效果截圖如下:
非常簡單的一段程式碼,程式碼由上而下很順利的執行完畢。
再來看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼func(); function func(){ console.log("螞蟻部落"); }
程式碼執行效果截圖如下:
上面程式碼也可以順暢的執行。
在文章的開頭提到過,JavaScript程式碼是從上到下執行的,函式宣告在下,函式呼叫在上。
為什麼還可以正常呼叫函式,並列印出"螞蟻部落"字串,這就涉及到宣告前置概念。
宣告前置包括變數宣告前置和函式宣告前置,分別做一下分析。
一.變數宣告前置:
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼console.log(webName);
程式碼執行效果截圖如下:
程式碼執行報錯了,因為變數webName並未宣告。
對一個未宣告的變數求值會報錯。
[JavaScript] 純文字檢視 複製程式碼執行程式碼console.log(webName); var webName="螞蟻部落"; console.log(webName);
程式碼執行效果截圖如下:
第一行程式碼下方宣告變數webName,這時第一行程式碼不會報錯,並列印出undefined。
第三行程式碼則可以列印出字串"螞蟻部落",下面分析一下原理。
我們總說程式碼執行,其實在JavaScript中,程式碼的"執行"僅是JavaScript程式碼執行的一部分,在程式碼執行之前,程式碼還需要進行"詞法分析"。在詞法分析階段,變數會被宣告被前置,並賦初值為undefined,詞法分析結束之後,再去執行程式碼,在程式碼執行階段,變數被賦值為使用者規定的值。所以上面的程式碼可以大致等同如下:
[JavaScript] 純文字檢視 複製程式碼// 詞法分析階段,變數宣告被前置並賦初值為undefined。 var webName=undefined // 執行階段,變數預設值為undefined。 console.log(webName); // 執行階段,變數賦值為字串螞蟻部落 webName="螞蟻部落"; // 執行階段,列印出字串螞蟻部落 console.log(webName);
已經進行註釋說明,不再多做介紹。
二.函式宣告前置:
函式宣告也會前置,前面的程式碼已經進行了演示。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼func(); function func(){ console.log("螞蟻部落"); }
和變數宣告前置基本一樣,在詞法分析階段,變數被前置宣告,所以上述程式碼可以正常執行。
三.特別說明:
被前置宣告的變數或者函式都被侷限於當前作用域。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function func(){ console.log(webName) var webName="螞蟻部落"; } func();
變數webName宣告前置侷限於函式作用域,通俗的將它被前置於函式作用域的頂端。
更多相關內容可以參閱JavaScript 詞法分析簡介一章節。
相關文章
- JS變數宣告和函式宣告提升JS變數函式
- 淺談JS變數宣告和函式宣告提升JS變數函式
- 深入解析JS變數宣告和函式宣告提升JS變數函式
- JavaScript 宣告變數JavaScript變數
- javascript 的函式宣告與表示式對比JavaScript函式
- javascript之變數提升與函式提升JavaScript變數函式
- 函式宣告與變數宣告的提升機制優先順序問題函式變數
- 瞭解 JavaScript 函數語言程式設計 - 宣告式函式JavaScript函數程式設計函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- Javascript 函式和變數提升JavaScript函式變數
- 深入淺出JS - 變數提升(函式宣告提升)JS變數函式
- 用預編譯去理解函式宣告提升和變數宣告提升編譯函式變數
- JavaScript函數語言程式設計之pointfree與宣告式程式設計JavaScript函數程式設計
- JavaScript塊級作用域宣告函式JavaScript函式
- 函式外與函式內的變數函式變數
- 關於變數的宣告和定義、內部函式和外部函式變數函式
- 何時使用函式表示式與函式宣告函式
- JavaScript變數宣告帶var與不帶var區別JavaScript變數
- JavaScript 判斷變數是否是函式JavaScript變數函式
- 變數和函式宣告提升,let和var const區別變數函式
- JavaScript 之有趣的函式(函式宣告、呼叫、預解析、作用域)JavaScript函式
- javascript變數的宣告以及命名規則JavaScript變數
- 函式宣告與函式表示式有什麼區別?函式
- task04 變數與函式變數函式
- 《前端實戰總結》之變數提升,函式宣告提升及變數作用域詳解前端變數函式
- 關於javascript中變數及函式的提升JavaScript變數函式
- 複數與複變函式選題函式
- Task 04 變數與函式 Variables and Functions變數函式Function
- 06函式宣告函式
- Javascript函式引數求值——Thunk函式JavaScript函式
- JavaScript | 函式與方法JavaScript函式
- JavaScript 同時宣告多個變數並賦值JavaScript變數賦值
- js變數與函式常識學習JS變數函式
- 你不知道的JavaScript--Item6 var預解析與函式宣告提升JavaScript函式
- TypeScript 變數宣告TypeScript變數
- EventEmitter:從命令式 JavaScript class 到宣告函式式的華麗轉身MITJavaScript函式
- var與let宣告變數的區別變數
- go語言 變數的宣告與使用Go變數