为什么会输出3?

为什么会输出3?

不是仅作用在快级作用域内么 为啥也能打印外面的i 而且为啥会是3?

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

正在回答 回答被采纳积分+1

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

7回答
好帮手慕久久 2020-10-07 10:44:03

同学你好,问题解答如下:

代码是从上往下读的,并且边读边执行,即js代码是从上往下执行的,对于这个例子,代码会先读“let monkey = '我是美猴王';”并执行它,然后再往下读取并执行“{ console.log(monkey);  let monkey = '我觉得我还能再抢救一下!';}”,以此类推......,所以A处代码报错后,A下面的代码就不会执行了,即B处不会执行,该种现象和作用域没关系,它和代码的执行顺序有关系,代码的执行过程,可以类比于一条河流(没有支流),河流从上往下流,只要中间有个位置堵了(代码报错),那么河流就不再往下流了(程序终止)。

同学试着理解一下。

祝学习愉快!

好帮手慕码 2020-09-30 13:44:09

同学你好,非常抱歉理解错了同学的意思,导致没有正确解答。

如下图:

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

A处打印语句会报错,是因为暂存死区的缘故。B处打印语句由于A处打印语句的报错,导致阻断代码执行,因此:B处打印语句是没有执行的,因此没有打印。

可以把A处注释掉,然后看下:

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

是可以访问到全局变量的。

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

可以再理解一下。祝学习愉快~

  • 提问者 陈立天 #1
    代码不是从上往下读的吗(也就是会把代码全部读完)?上面A报错,B应该可以打印才对? b打印语句和A的打印错误有什么联系吗?一个是块级作用域内的,一个是全局的。不理解原理是什么?什么时候会阻断代码执行?
    2020-09-30 18:56:45
提问者 陈立天 2020-09-30 09:35:16
  • 提问者 陈立天 #1
    或者说是不是首先是往上找找到的第一个是块级作用域的局部变量monkey所以它就报错了,他不会继续往上找而找到全局的monkey 即使是正确的。 这样理解对么
    2020-09-30 09:36:49
提问者 陈立天 2020-09-30 09:23:44

老师是关于这点我不理解

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

  • 提问者 陈立天 #1
    下面的报错是不是因为重复声明同一个let 所以报错?
    2020-09-30 09:26:36
好帮手慕码 2020-09-29 11:21:01

同学你好,解答如下:

1、视频里,将let修改为var的时候,外层打印才输出的3如果是用let声明的话,是会报错的(视频8.38分前后有讲到)

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

在for循环中,使用var声明i,即如下:

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

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

结果为0123的原因是:

(1)在for循环中,i是全局变量,它从0开始,每循环一次会加1,终止条件是i<3。

(2)当i=0、1、2时,满足for循环条件,会执行for里面的代码,即执行console.log(i)。执行完i=2时候,还会执行i++,所以i变成了3,此时,3不再满足i<3的条件,因此for循环结束。

(3)代码继续往下执行,即执行循环外层的打印,由于i已经变成了3,所以此处会打印3。

关于它的循环过程,建议复习下相关课程:https://class.imooc.com/lesson/769#mid=19251

2、同学可能看错了,是把let修改为var才可以打印出内容的。let只作用在当前块级作用域内,所以这样写是报错的:

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

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

3、这块是暂存性死区的概念,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。

解释:只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。

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

上面代码中,存在全局变量monkey,但是块级作用域内又声明了一个局部变量monkey,导致后者绑定这个块级作用域,所以在let声明变量前,对monkey赋值会报错。

ES6 明确规定,如果区块中存在let,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

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

提问者 陈立天 2020-09-29 08:08:23
提问者 陈立天 2020-09-29 08:02:30

这个i都是输出不来的,为什么上面那个却可以输出?

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

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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