第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

4 回答

已采納
?
_瀟瀟暮雨

TA貢獻646條經(jīng)驗 獲得超225個贊

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

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

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

查看完整回答
反對 回復(fù) 2016-09-16
  • my2dieer
    my2dieer
    如果第一個參數(shù)是函數(shù),貌似也是在全局中執(zhí)行的喔,在函數(shù)內(nèi)部打印this會得出window,得出b=22,是因為閉包,a()中的b保持了對函數(shù)內(nèi)部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條經(jīng)驗 獲得超103個贊

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

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

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

用匿名函數(shù)就能完美解決了。

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

查看完整回答
反對 回復(fù) 2016-09-18
?
mov1er

TA貢獻2條經(jīng)驗 獲得超0個贊

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

查看完整回答
反對 回復(fù) 2016-09-17
  • 4 回答
  • 1 關(guān)注
  • 1471 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號