4 回答
已采納

_瀟瀟暮雨
TA貢獻646條經驗 獲得超225個贊
全局變量作用域,你寫成這樣:
function?a(){ var?b?=?22; return?function(){ setTimeout(alert(b),?1000) } } a()()
setTimeout的第一個參數可以是字符串,也可以是一個函數。如果是字符串會在全局作用域下執行(你的全局作用域上沒有b)。

OlderSkee
TA貢獻123條經驗 獲得超103個贊
這種情況的setTimeout解析字符串很容易出問題的,這是js這種語言本身的原因
如果改成 ??setTimeout(alert(b),1000) ?//這樣會有bug,沒有1秒的延遲效果
或者?????setTimeout(function () {
? ?alert(b)
},1000)
用匿名函數就能完美解決了。

my2dieer
TA貢獻1條經驗 獲得超0個贊
????????????????var?b=33; function?a(){ var?b=22; return?function(){ console.log(b);????//22 window.setTimeout("console.log("+?b?+")",1000);???//22 window.setTimeout("console.log(b)",1000);????//33 } } a()();
本身對這個問題內部運行也不是太清楚明了,偶然寫出來試了一下,覺得大概是因為setTimeout中b的問題.
如樓主截圖中,直接使用"console.log(b)",a()執行后返回的函數中,沒有變量b,只有字符串b,所以沒有一個變量對函數內部的b=22保持引用,在a()()時,執行的結果便是b在全局中查到的33。而如果換做第二種寫法,a()執行后,存在b變量,對b=22保持了引用,所以在a()()時,得出22。
添加回答
舉報
0/150
提交
取消