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