關於JS中變數提公升的規則和原理的一點理解(一)

2022-02-24 19:13:12 字數 989 閱讀 8476

(function())()

// undefined i love you

這就是乙個典型的變數提公升的例子了,規則是怎樣的呢,我的理解是在乙個作用域內,無論你在哪個地方宣告的變數都會被提公升到頂部,但不會賦值。像本例子中的v就是先被提公升到了函式作用域的頂端,所以實際執行過程是這樣的:

(function())()

// undefined i love you

js自上而下的執行過程分為兩個詞法分析和執行兩個階段:詞法分析主要包括:分析形參、分析變數宣告、分析函式宣告三個部分.通過詞法分析將我們寫的js**轉成可以執行的**,接下來才是執行。

變數提公升還有一種情況,就是函式,詞法分析的時候關於函式宣告的處理與變數宣告的處理不太一致,會一步到位的給當前函式活動物件增加對應函式名的屬性,並重寫該方法。也就是不會像變數那樣先賦值undefined了。說的有點繞,我們還是看**,可以先自己看一下執行結果,再看下面的分析:

function a()

alert(b)

}a()

簡單說下,詞法分析時對function b的處理:給當前函式活動物件obj增加屬性b,並賦值。即:obj.a = function(); 所以詞法分析後的結果成了這個樣子:

function a()

b = 'a';

alert(b); // a

}a()

這個地方也只是我讀別人觀點的一種借鑑,但是我有點不太確定的是普通變數提公升和函式提公升同時進行時到底誰在最頂端?反正就目前我的認識變數提公升的規律是清楚了,大提公升提公升的原理是因為js執行機制的問題,為了盡量避免變數提公升帶來的一些困擾,日常開發中文名還是要養成先宣告再使用的好習慣,盡量在函式開頭把所有變數都宣告出來。文中觀點大都是個人理解,如有不對,歡迎指出!

參考文章:

js中的變數提公升和函式提公升

一,變數提公升 顧名思義,變數提公升就是函式在執行時,會把在下面的變數提公升到函式的top位置,來看栗子 var scope hello function t t 此時輸出的結果是 第乙個輸出undefined 根據作用域鏈,函式內部訪問乙個變數時,會首先在作用域鏈的前端也就是函式內部尋找變數,找到...

js中的變數提公升和函式提公升

從上週開始,我所在的學習小組正式開始了angular的學習,angular是全面支援es6的,所以語法上和以前的angular有了很大的不同,比如變數宣告時就拋棄了var,而選擇了let和const 記得剛開始學習js的時候,使用webstrom時用var,webstrom會在下面畫一條小綠線,表示...

js中的變數提公升和函式提公升

從上週開始,我所在的學習小組正式開始了angular的學習,angular是全面支援es6的,所以語法上和以前的angular有了很大的不同,比如變數宣告時就拋棄了var,而選擇了let和const 記得剛開始學習js的時候,使用webstrom時用var,webstrom會在下面畫一條小綠線,表示...