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

2021-10-14 07:52:17 字數 2540 閱讀 1458

在js中在宣告變數或者函式時,會將變數或者函式的建立或者初始化放在**最頂端,而賦值過程仍在原地,這就是變數提公升(函式提公升);它並不是物理層面的**移動,而是在編譯時,會先放到記憶體中去。

在es6中新增了let和const兩中宣告變數的方式,那麼它們和var相比較到底有什麼區別呢?

首先我們先知道兩點:(1)var和let是變數,const是常量。(2)var沒有塊級作用域,let和const有塊級作用域。

// 使用 var

for(

var i =

0; i <

10; i++

)console.

log(i,j)

// 結果: 10 10

// 使用let

for(

let i =

0; i <

10; i++

)console.

log(i,j)

// 結果: referenceerror: i is not defined

以上**就可以看出,let只在**塊以內有效,而var不是。

var在宣告變數時,分別會經歷三個過程:建立(在記憶體中建立變數)->初始化(將變數初始化為undefined)->賦值(為變數進行賦值)。那麼在這三個過程中,究竟是什麼時候進行了變數提公升。

// var 變數提公升

console.

log(a)

//結果: undefined

var a =

100// 執行過程

// 1.建立變數 a (提公升了)

// 2.初始化變數 a 為 undefined(提公升了)

// 3.列印 a 此時它為 undefined

// 將 a 賦值為 100

以上**其列印結果為undefined也就是說它被初始化了而沒有賦值,所以var宣告變數的時候,建立和初始化被提公升了,而賦值過程沒有被提公升。我們也可以把以上**當作是下面這樣子:

// 相當於以下**

var a // 建立和初始化

console.

log(a)

// 結果: undefined

a =100

// 賦值

let在宣告變數時,同樣有三個過程建立->初始化->賦值,基於此我們來看一看let在宣告過程的變數提公升。

// let 變數提公升

console.

log(a)

// 結果:referenceerror: a is not defined

let a =

100

直接報錯了,我們無法使用乙個未初始化的資料,也就是說let在宣告變數時,初始化過程並未被提公升,後面的賦值過程並不會執行。我們在看一段**

let a =

100!

(function()

)()

在這段**中,並沒有輸出100,這是因為在下面的塊作用域裡面,a被建立了,所以js會優先使用當前作用域的a,但是我們已經知道並沒有初始化,所以會報錯。

由此我們就知道let在宣告變數時,建立過程被提公升了,初始化和賦值過程沒有被提公升。

const 和 let 是的變數提公升是一樣的,但是有乙個區別就是,const是常量,不可被修改,所以沒有賦值過程。

我們分別進行函式宣告和字面量宣告的方式分別看看函式提公升。

// 函式宣告方式--function

console.

log(foo)

// 結果: [function: foo]

function

foo(

)// 字面量宣告方式--var

console.

log(foo)

// 結果: undefined

varfoo

=function()

// 字面量宣告方式--let

console.

log(foo)

// 結果: referenceerror: foo is not defined

letfoo

=function()

// 字面量宣告方式--const

console.

log(foo)

// 結果: referenceerror: foo is not defined

const

foo=

function()

由以上**可以看出,使用function的函式宣告方式,建立、初始化、和賦值都被提公升了。而使用字面量方式宣告函式的話,和上面講的var let const的變數宣告的變數提公升保持一致。

var宣告變數的時候,建立和初始化被提公升了,而賦值過程沒有被提公升。

let和const在宣告變數時,建立過程被提公升,但是初始化過程並未被提公升,另外let有賦值過程而const沒有。

使用function的函式宣告方式,建立、初始化、和賦值都被提公升了。而使用字面量方式宣告函式時,和var let const的變數宣告的變數提公升保持一致。

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會在下面畫一條小綠線,表示...