关于闭包取值的问题,代码以格式化

来源:17-1 异步和单线程-什么是异步

meimei1314

2019-10-26

var a = 100;
function F1( ) {
	// var a = 200;
	return function ( ) {
		console.log(a)
	}
}
var f1 = F1( );
function F2(fn) {
	var a = 300;
	fn( );
}
F2(f1);  // 100,输出的是100

老师,请问一下,闭包作为参数传递时,查询自由变量a的时候,
第一步,在其定义时父作用域F1中寻找,
第二部,若没有找到,不应该是其参数fn的父作用域F2中寻找么?
请问,为什么最后是在全局作用域中寻找呢?不应该是最后才是在全局作用域中寻找么?

写回答

2回答

双越

2019-10-26

F1 是 fn 定义时的作用域,F2 是 fn 执行时的作用域。注意,一个是定义,一个是执行。

而自由变量 a 的查找,只跟定义作用域有关,跟执行作用域无关。

所以,你说的“第二部,若没有找到,不应该是其参数fn的父作用域F2中寻找么?”,是理解错误的。正确的应该是,去 F1 父作用域寻找,即全局作用域。

0
0

双越

2019-10-26

http://coding.imooc.com/learn/questiondetail/148449.html 这也是你提的问题,跟这个问题相同,我在这个问题中回复说让你改一下代码格式,你也没改。直接又重新提问了一个。那我就帮你改了吧。

但学不会 markdown ,以后无论是提问还是写开发文档,都会是一个障碍。还是建议你去学一下,也不难。

另外,对于老师回复的内容,看不明白可以继续追问,我也会继续解答,但是千万不要视而不见或者不理会。

0
0

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程