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...