Javascript 函式和變數提公升

2021-09-11 17:41:37 字數 2141 閱讀 3385

變數提公升和函式提公升基本上是面試必問題目

//先從乙個面試題說起

console.log(a)

if (a)

function

a()

console.log(a);

a()複製**

下面我們針對這個栗子解析一下

我們知道變數和函式定義都會提公升到作用域最前邊

唯一需要確認的是變數和函式的先後順序

我們預想 函式是用第一公民會不會提公升到最前邊呢?

//如果是解析完順序是這樣的

function

a()

var a;

console.log(a)

if (a)

console.log(a);

a()複製**

按照我們預想的解析結果應該是

// undefined // undefined // 報錯

理由 函式在上var在下,第乙個console時a未賦值,其結果是undefined,if為false 只剩最後乙個console也是undefined 最後a is not a function.

不過結果是

我機智的認為 預想錯了?

//再次測試

var a;

function

a()

console.log(a)

if (a)

console.log(a);

a()複製**

這樣?對比一下結果 人工解析結果 : 1、a() 2、1 3、1 4、a() 報錯

瀏覽器執行結果:

沒毛病!

看到這裡一切完美,不過我還是重新搜尋了一些高質量文章,發現我錯了,雖然執行結果是對的,不過瀏覽器和人工解析還是不一樣的,和我們最開始預想的一樣,函式優先。

既然標題說到了 變數 和 函式,我們就一塊來說說

//簡單的栗子

functiona()

console.log(a)

var a = 1

a()複製**

首先上邊已經說到我們預想和認為的是錯的。

正確解析順序是這樣的

functiona()

var a;

console.log(a)

a = 1

a()複製**

但是,這個但是很重要瀏覽器執行結果是:

why?這就要講講我所了解到的原理。

同名變數和函式,函式會提公升到最前邊,變數其次,那為什麼結果不是我們人工執行的undefined呢?原因是 變數會被忽略,是的是忽略。。。

functiona()

var a;//忽略

console.log(a) //列印函式本身

a = 1

a()// a is not a function

複製**

完美!

還有呢?是的還有同名變數是怎樣的順序,同名函式是怎樣的順序。

同名變數

console.log(a)

var a = 1

console.log(a)

var a = 2

console.log(a)

//解析完順序是這樣的

var a;

var a; //忽略

console.log(a) // undfined

a = 1

console.log(a) //1

a = 2

console.log(a)//2

複製**

*同名變數,宣告會被提公升,後邊會忽略。

同名函式

functiona()

console.log(a)

functiona()

console.log(a)

a()//解析完

functiona()

functiona()

console.log(a)

console.log(a)

a()複製**

執行結果

我想你已經猜到了,同名函式會被覆蓋。

終於完了!

您的點讚是我繼續下去的動力,謝謝!

Javascript 函式和變數提公升

變數提公升和函式提公升基本上是面試必問題目 先從乙個面試題說起 console.log a if a function a console.log a a 複製 下面我們針對這個栗子解析一下 我們知道變數和函式定義都會提公升到作用域最前邊 唯一需要確認的是變數和函式的先後順序 我們預想 函式是用第一...

javascript變數提公升和函式提公升

variable hoisting變數提公升是js比較有特點的地方,它允許你先使用變數,在其後面再進行變數宣告,不會丟擲 uncaught referenceerror異常。雖然變數被提公升到前面,但是它的預設值則是undefind,在引用的時候也使用這個值,知道在其面後進行賦值,在使用時候即為所贖...

JavaScript 型別和變數

在程式語言中,能夠表示並且操作的型別叫資料型別,但我們需要將值儲存起來以備以後使用的時候,我們就需要將值儲存到乙個變數中。js中資料分為兩類 原始型別 primitive type 和物件型別 object type 原始型別資料報括數字 字串和布林值,並且js中有兩個特殊的原始值null 空 和u...