亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這里無法訪問到閉包里的b變量?

為什么這里無法訪問到閉包里的b變量?

samdeo 2016-09-16 17:01:09
查看完整描述

4 回答

已采納
?
_瀟瀟暮雨

TA貢獻646條經驗 獲得超225個贊

全局變量作用域,你寫成這樣:

function?a(){
	var?b?=?22;
	return?function(){
		setTimeout(alert(b),?1000)
	}
}
a()()

setTimeout的第一個參數可以是字符串,也可以是一個函數。如果是字符串會在全局作用域下執行(你的全局作用域上沒有b)。

查看完整回答
反對 回復 2016-09-16
  • my2dieer
    my2dieer
    如果第一個參數是函數,貌似也是在全局中執行的喔,在函數內部打印this會得出window,得出b=22,是因為閉包,a()中的b保持了對函數內部b=22的引用。 var b=33; function a(){ var b=22; return function(){ window.setTimeout(function(){ console.log(b); //22 console.log(this); //window },1000); } } a()();
?
OlderSkee

TA貢獻123條經驗 獲得超103個贊

這種情況的setTimeout解析字符串很容易出問題的,這是js這種語言本身的原因

如果改成 ??setTimeout(alert(b),1000) ?//這樣會有bug,沒有1秒的延遲效果

或者?????setTimeout(function () {
? ?alert(b)
},1000)

用匿名函數就能完美解決了。

查看完整回答
1 反對 回復 2016-09-17
?
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。

查看完整回答
反對 回復 2016-09-18
?
mov1er

TA貢獻2條經驗 獲得超0個贊

閉包訪問不到局部的b,只有找全局里找

查看完整回答
反對 回復 2016-09-17
  • 4 回答
  • 1 關注
  • 1497 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號