问老师一个问题

问老师一个问题

比如这样一个函数

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		function fn() {
			var i = 1;
			return function fn2(){
				console.log(i);
			};
		}
		fn()();
	</script>
</body>
</html>

http://img1.sycdn.imooc.com//climg/5ec2970e09233ac103940190.jpg

执行完红色框内时,得到的应该是箭头所指的函数,此时此刻再执行后面的(),它应该读取不到变量i才对,会报错。

但是为什么依旧能读取到最初fn中的var i = 1的赋值

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,如下的理解都是不对的:

http://img1.sycdn.imooc.com//climg/5ec489cf097fba0607450092.jpg

http://img1.sycdn.imooc.com//climg/5ec489ea0930236f08120214.jpg

建议同学把自己的这些理解都丢弃,跟着老师的回复重新理解。另外,同学现在不懂的这些,有一部分比较深,所以老师简单的给你讲解一下,你固定记住就行。后面的课程也会涉及到一些。如果还不理解,建议先往后学习,等学到《面向对象》中的闭包会好理解一点。

具体参考如下:

一个普通的函数,调用它,会形成一个局部作用域。等他执行完毕,就会把它销毁了。例如如下函数会被销毁。

http://img1.sycdn.imooc.com//climg/5ec48e64091b233203510134.jpg

但是注意,函数内部变量如果还在使用中,是不会销毁的。这就是垃圾回收机制的特点,你固定记住就行。下面的例子中,fn调用形成一个局部作用域,但是fn2也在这个作用域里面(从代码结构中,fn2是在fn中定义的,所以fn2在fn作用域里面)。所以fn2肯定是可以拿到变量i去使用的。fn2使用到这个变量i,变量i就不会销毁。变量i就是临时存在内存里面(内存这个很抽象,我们不用去深究),等它彻底没有用了,才会被垃圾回收掉。fn调用完毕之后,又调用了fn2。fn2中使用到i,说明这个变量i还不是垃圾,所以并不会被销毁。(如果同学不理解,就直接记住,这都是规定的。)

http://img1.sycdn.imooc.com//climg/5ec48f49099cf41803770214.jpg

祝学习愉快~

提问者 学习plus 2020-05-19 22:17:35

http://img1.sycdn.imooc.com//climg/5ec3e82c09b21bab03780219.jpg

我打印了fn()

http://img1.sycdn.imooc.com//climg/5ec3e847098677f002770058.jpg

在我看来,fn()它就是这么一个独立存在的函数,它内部的i在我看来就应该是未定义的,fn()()执行后应该出现

http://img1.sycdn.imooc.com//climg/5ec3e8bd09495a2b03310022.jpg

应该和原函数没有半毛钱关系,就和母亲和孩子一样,没出生前,孩子缺营养了【变量】,可以从母亲那获取营养【上层定义域查找】,但一旦出生了,就不可能再吸收的到【不在定义域内了】。

http://img1.sycdn.imooc.com//climg/5ec3e90b095adcf903270155.jpg

但事实证明它依旧可以调用到,fn()()输出了1,无法理解。

它到底是怎么获取到的,是隔着十万八千里,从fn()找的?

还是说它执行fn()的时候,一步步下来,创建了var i = 1,并保存在它客观存在的定义域里?

好帮手慕夭夭 2020-05-19 11:00:38

同学你好,理解的不对,fn2可以访问上层作用域中的变量。当fn()调用之后,就会执行fn中的内容,即定义了一个变量i,并会返回fn2。因为fn2中使用到了i,所以变量i并不会销毁。后面再加一个括号调用fn2,会拿到上一层作用域中的变量i哦。只有当fn2执行完毕了,用不到了,i才会销毁。重新理解一下哦

http://img1.sycdn.imooc.com//climg/5ec34a630941ed4803840177.jpg

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 学习plus #1
    不太理解这句话:【因为fn2中使用到了i,所以变量i并不会销毁。】 意思是,虽然fn()得到的只是作为返回值的函数,但如果返回值函数中用到了fn中的变量,哪怕出了作用域,也会暂时不销毁。是这个意思吗?那var i在这个过程中,临时存放在哪里? 因为我寻思fn()执行完毕,var i 相当于出了作用域,按垃圾回收理应被销毁才对,居然还能调用到。
    2020-05-19 21:58:50
  • 提问者 学习plus #2
    如果只是单纯的 function fn(){ var i =1; return i; } 那我觉得很好理解,我会直接将 return i当做 return 1。 但这个涉及到再调用,我不清楚这个过程中变量 i是处于一个什么样的状态,在我看来,只要return了,return出来的值就应该和原函数没有半毛钱关系,作为一个单独的个体,为什么内部的变量还能追溯到原函数其所处位置的上一层作用域。
    2020-05-19 22:03:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师