[英]Do inner functions in JavaScript get hoisted? How do the scoping rules apply to them?
我以為JavaScript沒有塊范圍,而是函數范圍,並且聲明從其塊提升到了父函數的頂部。
但是,以下代碼無法正常工作:
function one(a) {
console.log("one called for " + a);
if (a == 1) {
function inner(b) {
console.log("inner called for " + b);
}
inner(123);
}
inner(456);
}
one(1);
one(2);
one(3);
第one(1);
調用正常進行,沒有任何錯誤,但是在第二one(2);
時執行停止one(2);
叫做。
此行為很直觀:僅當a==1
時才定義函數inner
。
但是,它與范圍/吊裝規則如何一致?
我認為它的定義將被提升到它的作用域的頂部,在應該沒有作用的if
塊之外!
編輯:這是我得到的錯誤:
瀏覽器是Firefox。 在這里擺弄。
if (…) { function …() { … } }
無效的ECMAScript。 函數聲明必須在函數或程序主體的頂層,在塊內部, 其行為取決於實現 。 Firefox確實有條件地執行此函數語句 ,其他瀏覽器確實像常規函數聲明那樣提升它。 將其移至if語句之外,或分配一個函數表達式。
inner
的聲明被提升到外部函數的頂部。 但是,僅當a == 1
時才設置其值。
當outer()
被調用一個不同的值,調用inner(456)
失敗作為inner
仍然被設置為undefined
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.