變數提公升, 函式提公升之我見

2021-10-19 05:07:02 字數 1922 閱讀 4233

console.

log(a)

// undefined

var a =

1

**上先輸出, 後宣告, 應該輸出 「a is not defined」

但實際上輸出 a 時, a 沒有報 「a is not defined」

說明 a 已經被宣告, 未被賦值

這種宣告位置被提公升到作用域最高的現象, 就是所謂的變數提公升

同時還告訴我們乙個重要資訊

宣告 和 賦值 可以分開執行

都知道函式有兩種寫法

// fn 函式宣告

function

name()

// nf 函式表示式

varname

=function()

通常情況這兩寫法是等效的, 但在提公升的問題上, 兩者有點微妙的差異

本文根據 name 的先後, 暫把兩種方法分別簡稱為 fn(函式宣告) 和 nf(函式表示式)

console.

log(

name

)// ƒ name()

function

name()

/* 區分兩段** */

console.

log(

name

)// undefined

varname

=function()

很奇妙的現象, 沒有報 「name is not defined」 說明兩者的變數都提公升了, 與常量的提公升無異

函式表示式(nf) 輸出 undefined, 這就對應了上面的結論"宣告 和 賦值 可以分開執行"

函式宣告(fn) 能輸出對應函式, 說明宣告提公升時, 賦值也一起被提公升了

我們可以理解為: 函式宣告(fn) 寫法賦值隨宣告一起提公升; 函式表示式(nf) 寫法賦值在原地執行

這就是 函式宣告(fn) 與 函式表示式(nf) 的區別所在

記住兩點

再把問題拆開來分析, 其實並不複雜

來看幾個例子

var fun2 =

3function

fun2()

console.

log(fun2)

// 3

/* 解析成 */

var fun2

function

fun2()

// 以下正文

fun2 =

3console.

log(fun2)

// 3

var fun2 =

3var

fun2

=function()

console.

log(fun2)

// ƒ ()

/* 解析成 */

var fun2

// 以下正文

fun2 =

3fun2

=function()

console.

log(fun2)

// ƒ ()

console.

log(a)

console.

log(

foo())

var a =

1function

foo(

)/* 解析成 */

var a

function

foo(

)// 以下正文

console.

log(a)

console.

log(

foo())

a =1

end

變數提公升 函式提公升

函式表示式 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...