昨天看到一位掘友发的一个问题,好像是一个简单问题,结果挺有深度的,但是我还是不知?

昨天看到一位掘友发的一个问题,好像是一个简单问题,结果挺有深度的,但是我还是不知?




阅读全文
请先 登录 后评论
  • 0 关注
  • 0 收藏 111 浏览
  • 略问用户 提出于 2020-10-22 17:35:04

35 个回答

xxxxxa
我写了篇文章研究了下,觉得可以解释通了 https://juejin.im/post/5d90ae9ef265da5b646480a0
请先 登录 后评论
xxxxxa
人生苦短,快用typescript
请先 登录 后评论
xxxxxa
其实我只想知道为啥
请先 登录 后评论
xxxxxa
我只想知道这种代码的图怎么搞的?
请先 登录 后评论
xxxxxa
变量提升没啥问题。有疑惑的点应该是内外变量值同步的问题。 感觉内外同步的时间点是在 function a(){} 这段代码执行的时间点: { function a() {}; // 同步当前 a 的值 到外面, a = 50; } console.log(a); // 所以 a = function { b = 50; function b() {}; // 同步当前 b的值 到外面 } console.log(b); // 所以 b = 50 { function a() {}; // 同步当前 a 的值到外面, a = 50; function a(){}; // 同步当前 a 的值到外面 } console.log(a); // 所以 a = 50 引入window { function a() {}; // 同步当前 a 的值到外面 a = 50; window.a = 10 function a() {}; // 同步当前 a 的值到外面 } console.log(a); // 所以 a = 50
请先 登录 后评论
xxxxxa
首先块内函数a声明,会发生3件事情,1:类似var,会在块外提前声明var a=undefined ,在这里例子里,块外就是全局。2,在块内会提升函数声明到顶部。3,会把块内的a的值同步到块外。 第三点是我根据这里例子而推论的。那么重点就是在什么时机时,会把块内的a值同步到块外?就是在声明那一行所做的事情,而不是提升到顶部时做的。照这个逻辑来解释图1 a,由于函数声明在第一行,所以3件事在这一行都做了,块外的a值变为function ,而运行到第二行时,块内的a值变为50 ,window.a 依旧是function,不被影响。这里可以console.log(a,window.a) 证实。 再来看图一 的b,第一行时 函数声明被提升到块内顶部,块外window.b =undefined ,块内函数b提升之后被修改为50. 而此时块外b依旧是undefined,而直到第二行,真正的function声明行时,我前面说的第三件事发生了,最诡异的情况发生了,块内b值被同步到了块外。也就是说此时b=50 window.b也等于50 了。可以在每一行log一下window.b 来观察块外值的变化。
请先 登录 后评论
xxxxxa
第一张图,函数a和变量a及函数b和变量b都是非块级作用域全部提升到全局,在全局调用函数a或b都是undefined,说明函数提升到全局了。由于块内都是同步代码,提升到全局也保持这个顺序。由于当前作用域内没有变量,所以到外层全局查找,它不再先找变量(非同一作用域内),此时如果全局有相同函数后面的会覆盖前面的,谁先声明到全局就输出谁停上查找(作用域链),所以答案很明显了
请先 登录 后评论
xxxxxa
你多换几个浏览器试试,你会怀疑人生的
请先 登录 后评论
xxxxxa
函数声明优先级比较高把
请先 登录 后评论
xxxxxa
感觉是钻了浏览器的空子,es5不允许在块级作用域声明函数,但是浏览器为了兼容之前的代码并不会报错,而是会将函数声明提升到作用域顶部,es6明确允许在块级作用域声明函数,块级作用域内部声明的函数在外部不可用,但是浏览器为了兼容之前的代码同样没有这样实现,而是会将块级作用域中的函数声明同时提升到全局和块级的顶部,并且es6在附录里也允许了浏览器有自己的实现方式。因此在块级作用域中声明函数如果真的想要达到块级的目的最好采用函数表达式
请先 登录 后评论