慕無忌1623718
2023-01-06 11:13:28
在一次采訪中,我被要求猜測以下片段的輸出:var foo = 1; function bar() { foo = 10; return; function foo() { }}bar();console.log(foo);我認為輸出將是 10,因為 bar 函數在重新分配 foo 的值后立即返回,但實際輸出是 1。是因為函數定義具有相同的變量名 (foo) 嗎?foo是否為內部變量創建了一個新范圍bar?
2 回答

皈依舞
TA貢獻1851條經驗 獲得超3個贊
這是一個在面試中提出的令人討厭(而且有點毫無意義)的問題!
它確實與foo范圍內的功能有關bar- 如果沒有它,它會按照您的預期進行。
var foo = 1;
function bar() {
foo = 10;
return;
}
bar();
console.log(foo);
原因是由于“提升”——其中的函數聲明作為一個新變量bar被提升到函數的開頭bar,并且由于 javascript 的性質允許您在運行時更改類型,它允許您設置它(而不是全球)foo到10。
它與這段代碼本質上是一樣的:
var foo = 1;
function bar() {
var foo;
foo = 10;
}
bar();
console.log(foo);

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
內部的函數聲明bar創建了一個新的局部名稱foo,它覆蓋了外部的名稱。本質上,該function foo() {}行被提升到函數的頂部。你可以在這里看到這個:
function bar() {
console.log(foo);
foo = 10;
console.log(foo);
return;
function foo() {}
}
bar();
所以foo = 10
修改局部foo
名稱,而不是全局名稱。
添加回答
舉報
0/150
提交
取消