一道 js 脑筋急转弯求解

2021-12-30 16:15:55 +08:00
 cheese
    {
      function a(){}
      a=1
      function a(){}
    }
    console.log(a,"1");
    {
      function a(){}
      a=1
      
    }
    console.log(a,"2");
    //输出
    //1 '1'
    //ƒ a(){} '2'

为啥第二个块的 a = 1 没有覆盖到全局的 a

3016 次点击
所在节点    JavaScript
33 条回复
murmur
2021-12-30 16:59:44 +08:00
你们吐槽谭浩强的勇气呢,怎么现在开始讨论这种恶心人的东西呢,生产写这种东西有几次你被打死几次
mxT52CRuqR6o5
2021-12-30 17:04:50 +08:00
@cheese
第一个块 a₁ = 1 后面有个 a₀ = a₁是因为你原代码第一个块的 a=1 后面有一句 function a(){}啊
你仔细读读我发的那个 sof 的链接就都明白了


cheese
2021-12-30 17:08:31 +08:00
@mxT52CRuqR6o5 #22 好的,感谢
liubaicai
2021-12-30 17:17:47 +08:00
有什么意义啊,谁生产会写这种代码?面试出这种题的也是 zz 。
iwasthere
2021-12-30 21:20:34 +08:00
因为如果变量名称跟已经声明的函数相同,则变量声明不会干扰已经存在的这类属性。
enchilada2020
2021-12-30 23:03:53 +08:00
我承认我不会 JS
litel
2021-12-31 11:16:33 +08:00
大家好像都没解释题主的“第二个块的 a=1 为什么没有提升至全局”
我也搞不清楚这里……
litel
2021-12-31 11:29:23 +08:00
@mxT52CRuqR6o5 那为什么第二个块的 a = 1 不会抛出到全局作用域呢?
就算是
b = 1
{ b = 2 }
b
// => 2
块作用域的 b 也会到全局,为什么最后不加同名 funtion 就不会到全局呢?
这里比较疑惑
mxT52CRuqR6o5
2021-12-31 11:34:27 +08:00
@litel
/t/825334#r_11227399
作用域提升相关的东西我不知道他说的对不对,但他所描述的代码执行过程完全就是错的
我没有说过作用域提升相关的东西,你问我怎么个提升的我也不清楚
mxT52CRuqR6o5
2021-12-31 11:40:48 +08:00
@litel
你所说的东西我尝试解释一下(一下内容为马后炮,根据结果猜测运行原理)
es6 非严格模式在块内声明 function 会同时在全局和块内生命同名变量,所以在块内对同名变量赋值只会影响块内

b = 1
{ b = 2 }
只有全局的 b ,没有块内的 b ,块内的赋值语句就直接修改了全局的 b
wangtian2020
2021-12-31 14:10:37 +08:00
有 globalThis 我就是不用
欸我就是玩儿
wangtian2020
2021-12-31 14:12:27 +08:00
qeqv
2022-01-01 11:18:35 +08:00
@wangtian2020 学了这个会不会被同事打死

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX