4 回答
已采納

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

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

my2dieer
TA貢獻1條經(jīng)驗 獲得超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()();
本身對這個問題內(nèi)部運行也不是太清楚明了,偶然寫出來試了一下,覺得大概是因為setTimeout中b的問題.
如樓主截圖中,直接使用"console.log(b)",a()執(zhí)行后返回的函數(shù)中,沒有變量b,只有字符串b,所以沒有一個變量對函數(shù)內(nèi)部的b=22保持引用,在a()()時,執(zhí)行的結(jié)果便是b在全局中查到的33。而如果換做第二種寫法,a()執(zhí)行后,存在b變量,對b=22保持了引用,所以在a()()時,得出22。
添加回答
舉報
0/150
提交
取消