js在if語句中的函式宣告會不會得到函式提公升

2021-10-22 09:57:29 字數 1071 閱讀 6082

話不說多,先上**。

var a =0;

if(true

) a =3;

}console.

log(a)

// a() {}

如果程式中遇見if語句的情況,且程式內恰好包含函式宣告的情況(一般我們不會寫出這樣的**,但是容易出現在面試題中)

首先看mdn的解釋

乙個被函式宣告建立的函式是乙個 function 物件,具有 function 物件的所有屬性、方法和行為。檢視 function 以獲取 function 的詳細資訊。

函式也可以被表示式建立( function expression )

函式可以被有條件來宣告,這意味著,在乙個 if 語句裡,函式宣告是可以巢狀的。有的瀏覽器會將這種有條件的宣告看成是無條件的宣告,無論這裡的條件是true還是false,瀏覽器都會建立函式。因此,它們不應該被使用。

預設情況下,函式是返回 undefined 的。想要返回乙個其他的值,函式必須通過乙個 return 語句指定返回值。

企鵝自己在這裡總結了幾點來解決此類問題

if語句內的函式無論是否被執行,同樣會被宣告到當前作用域的頂部,只不過值不是函式體,你可以理解成披著函式的外衣但是值卻是undefined,而在變數宣告與函式宣告中,毫無疑問,身為函式一等公民的函式宣告優先順序要高於變數宣告。

if語句內即{}內被視為乙個塊級作用域,變數以及函式在此處遵循一般的宣告規則

在執行到函式宣告時,當前作用域那個函式宣告的變數會被賦值為函式體

引用mdn的一句話,函式可以被有條件來宣告,這意味著,函式宣告可能出現在乙個 if 語句裡,但是,這種宣告方式在不同的瀏覽器裡可能有不同的效果。因此,不應該在生成環境**中使用這種宣告方式,應該使用函式表示式來代替。

切記此方法僅適用於es5

如果看懂了上面的,那麼再來看這道題

var a =1;

if(true)}

a()}

console.

log(a)

// a() {}

你答對了嘛?

DECODE在WHERE語句中的妙用

假設我們有兩個表,需要用row id連線,找出值相同或者不相同的資料 with temp1 as select 1 as row id,1 as cola from dual union all select 2 1 from dual union all select 3 null from du...

SQL語句中DATEDIFF 函式的用法

datediff datepart startdate enddate 釋義 計算時間差 datepare值 year quarter month week day hour minute second millisecond startdate 開始日期 enddate 結束日期 getdate ...

關於在case語句中變數的定義

case語句中宣告變數的各種情況分析 1,switch ch 這個是錯誤的,編譯器不會讓他通過編譯,理由是這樣的 int a 0 這個定義放在了case a 中,如果允許它順利通過編譯,會造成 不一致 考慮西面兩種情況 1 ch a 執行case a 分支,a順利的被初始化為0,執行完case a ...