變數提公升的原理

2021-09-13 01:10:06 字數 982 閱讀 3236

當程式執行這一段**時

console.log(a);

var a = 2;

有經驗的同學都知道控制台會輸出undefined而不是報錯a is not defined

這是因為此時發生了變數提公升,**可以理解為以下形式

var a;

console.log(a);// undefined

a = 2;

這是為什麼呢,讓我先說明以下幾點

每當編譯器遇到var ***,都會去查詢當前作用域是否已存在變數***,如果***已存在,則忽略該宣告,反之,在當前作用域宣告變數***

所以當成程式執行下面**時

console.log(a);

var a = 2;

首先編譯器查詢當前作用域是否存在變數a,發現a並不存在,宣告變數a

再由引擎執行由編譯器生成的**console.log(a),此時變數a已經被編譯器宣告,但是還未被賦值,所以此時控制台輸出的值是undefined

a = 2,此時變數a的值為2。

其實關鍵點就在於,由var關鍵字宣告的變數是在編譯階段宣告的,所以會出現變數提公升的情況。

但是編譯器對es6語法中的constlet關鍵字宣告的變數則不會提前宣告,所以不會出現變數提公升。

變數提公升 函式提公升

函式表示式 var fn function fn 函式宣告方式 function fn 我們需要重點注意的是,只有函式宣告形式才能被提公升。變數賦值並沒有被提公升,只是宣告被提公升了。但是,函式的宣告有點不一樣,函式體也會一同被提公升。複製 author laifeipeng date 2019 0...

變數提公升,函式提公升

1,變數提公升及函式提公升 2,函式作用域下的變數提公升和函式提公升 思考 變數提公升和函式提公升是怎麼樣產生的?1 在js中js引擎會優先解析var變數和function定義!在預解析完成後從上到下逐步進行!2 解析var變數時,會把值儲存在 執行環境 中,而不會去賦值,值是儲存作用!例如 ale...

變數提公升 函式提公升

如果熟悉js 執行的過程,這個問題不難理解 一 變數提公升 es5中沒有塊作用域,有全域性作用域 區域性作用域 函式 等 不宣告定義變數 console.log name 報錯,變數沒有定義 變數提公升 console.log info undefined,不報錯 var info hello fu...