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
提交
取消
