From 45aa0b82da22ee14daac36879fbe2caf1f0fb497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=AF=A1?= <1849613717@qq.com> Date: Tue, 14 Sep 2021 11:42:58 +0800 Subject: [PATCH] =?UTF-8?q?JavaScript=E5=8F=98=E9=87=8F=E6=8F=90=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e44a64f..65b1eeb 100644 --- a/README.md +++ b/README.md @@ -21,17 +21,37 @@ 成功采纳后,如果你面试遇到其他问题,笔者可以提供免费解答服务。 -### 今日原题 +### 变量提升 -第一题:[以下代码输出什么,为什么?](https://github.com/KieSun/fucking-frontend/issues/1)。 +- 为什么会出现变量提升? 因为JavaScript在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 +- JavaScript 只会提升声明,不会提升其初始化。如果一个变量先被使用再被声明和赋值的话,使用时的值是 undefined + ```js +console.log(yck) 输出结果 undefined +var yck='大佬'; + ``` + +- 用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有JavaScript执行到当前变量声明这句语句时,才能使用这个变量。 ```js -try { - (async function() { a().b().c() })() -} catch (e) { - console.log(`执行出错:${e.message}`) -} +console.log(typeof yck) ReferenceError +let yck='大佬'; ``` +```js +console.log(typeof yck) undefined +var yck='大佬'; +``` + +> 变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 + +- [ ] 文档 + - [ ] [JS 变量提升](https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting) +- [ ] 推荐文章 + - [ ] [JavaScript:变量提升&&作用域](https://www.huaweicloud.com/articles/716b97a06ee15d04f34b2d24b46e2bfe.html) + - [ ] [JavsScript 变量提升和函数提升](https://towind.fun/2021/05/10/js-hoisting/) + - [ ] [JavaScript的执行上下文](https://www.huaweicloud.com/articles/b0e28ae85a6f6d4e4e28824a94d17b51.html) + - [ ] [var,let,const和变量提升](https://www.clloz.com/programming/front-end/js/2020/07/01/variable-hoist/) + +> 务必自己总结规则! ## 前端十五万字面试资料