为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这里无法访问到闭包里的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 关注
  • 1374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信