问了好多人,这个es5问题貌似没人知道原因。。。有模糊的说作
javascript吧
全部回复
仅看楼主
level 3
问了好多人,这个es5问题貌似没人知道原因。。。有模糊的说作用域问题,也有人说变量提升,但是都是模糊其词。。。老实说,我也不清楚为啥
2020年07月21日 14点07分 1
level 3

2020年07月21日 14点07分 2
level 13
因为ES6的块级作用域,以前没有,现在有了以后,为了能让函数访问到块级,不得不用这种策略,因为函数声明不认块级作用域,但是在严格模式里不会再出现这种情况,函数会“严格”地呆在块级作用域里。
2020年07月21日 17点07分 3
老铁,你意思是说,目前浏览器认的大括号内的东西是一个块级作用域,相当于函数作用域了?!浏览器现在都这样了吗
2020年07月22日 01点07分
@真正逐鹿华夏 不是函数作用域,是一个单独的作用域,var 和 function 关键字都不认它,只有 let 认,它跟函数作用域是不同的。但是在严格模式里,function 关键字会模仿 let 关键字的行为。
2020年07月22日 02点07分
level 12
你说的没错网上说的都是模糊不清的也有代码来测试来解答 但我觉得都有点强行解释的感觉 其实为什么会这样 阮一峰老师那里也说过 因为es6有块级作用域的原因 按理函数声明也因该只生效于块级作用域 但是这么做的原因 不能兼容以前老代码的原因(以前是没没块级作用域的) 所以浏览器(支持es6的) 并没遵照这规则 所以它有自己行为(不过用严格模式可以消除这怪异行为 让其函数声明只在块级生效) 居然是浏览器自己怎么样行为(这个我也不是很清楚 网上说的也很模糊 感觉也不是所有es6浏览器统一的 这个就是厂商问题了) 所以你以后写代码的时候还是避免把函数声明写块级里 如果必要写还是用函数表达式为好[小乖]
2020年07月22日 02点07分 4
说得对
2020年07月23日 04点07分
level 1
这个不是因为循环里面的a还是和外面定义的a是同一个么,都是全局变量啊,打印出来肯定是1啊
2020年07月23日 05点07分 6
level 2
GO
最开始那个a=1 是在当前作用域没有找到,所以找到了外部的a,改成了1,之后再作用域内声明了a,是个函数。所以下面的a=4找到当前作用域的a,把它由存储地址变成存4。
2020年07月23日 08点07分 7
level 2
GO
这个是我的理解,但是在非严格模式下,js的行为是怪异的。会出现很多无法判断的情况。建议块级作用域使用严格模式
2020年07月23日 08点07分 8
level 1
写这种代码腿先打断,循环里面定义了一个变量a只有循环内有效,给a赋值,没有改变外面那个变量a
2020年07月23日 12点07分 9
level 7
你把a = 1移到a函数下面,你就会知道什么叫难以解释了
2020年07月23日 13点07分 10
所以,大佬现在用let多还是用var多?
2020年07月25日 12点07分
@52873731 所以对于这道题,关let和var什么事呢?
2020年07月25日 12点07分
@雨326后 打扰了,打扰了
2020年07月25日 13点07分
level 7
这个就看浏览器实现,es6规范都说了浏览器可以有自己的实现方式,而且这个函数到底在块里面怎么表现真的很难解释,都没有统一的规范
2020年07月23日 13点07分 11
level 7
而且你试试搁浏览器控制台跑一跑,答案都不一样呢,你这个我跑了答案是141
2020年07月23日 14点07分 12
第一个怎么可能是1??我变量提升白学了?
2020年07月23日 14点07分
@嘤嘤怪🌳 不一样的,这道题光看变量提升不管用
2020年07月24日 08点07分
level 7
for和if结果都是一样的
2020年07月23日 14点07分 13
level 6
可以去看看js的预编译
2020年07月24日 15点07分 14
1