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 1/6] =?UTF-8?q?JavaScript=E5=8F=98=E9=87=8F=E6=8F=90?= =?UTF-8?q?=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/) + +> 务必自己总结规则! ## 前端十五万字面试资料 From 5d54fb1aaa9d74b57e5334c91c07874014922a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=AF=A1?= Date: Tue, 14 Sep 2021 21:47:45 +0800 Subject: [PATCH 2/6] =?UTF-8?q?JavaScript=E5=8F=98=E9=87=8F=E6=8F=90?= =?UTF-8?q?=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 65b1eeb..0869fd8 100644 --- a/README.md +++ b/README.md @@ -23,33 +23,42 @@ ### 变量提升 -- 为什么会出现变量提升? 因为JavaScript在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 - -- JavaScript 只会提升声明,不会提升其初始化。如果一个变量先被使用再被声明和赋值的话,使用时的值是 undefined - ```js -console.log(yck) 输出结果 undefined -var yck='大佬'; - ``` - -- 用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有JavaScript执行到当前变量声明这句语句时,才能使用这个变量。 -```js -console.log(typeof yck) ReferenceError -let yck='大佬'; -``` -```js -console.log(typeof yck) undefined -var yck='大佬'; -``` - > 变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 +为什么会出现变量提升? 因为JavaScript在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 + +我们声明一个函数的时候如果在声明函数的前面调用这个函数也是可以执行的,因为这个函数在解析的时候函数声明会被移至其作用域的顶部 。函数提升只提升函数声明,不会提升函数表达式。 +```js +// 普通函数声明 +console.log(Gangster("yck")) // yck undefined +function Gangster(name) { + console.log(name); +} +``` +```js +// 声明式函数 +console.log(Gangster("yck")) // Gangster is not a function +var Gangster = function (name) { + console.log(name); +} +``` +在变量赋值前,函数声明依旧是函数声明,当变量赋值后,函数声明被会被相同名字的变量覆盖,所以说函数提升的优先级大于变量提升 +```js +function Gangster(){ + console.log("大佬"); +}; +console.log(Gangster); // Function: Gangster +Gangster(); // 大佬 +var Gangster = "我是变量的值"; +console.log(Gangster); // 我是变量的值 +``` + - [ ] 文档 - [ ] [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/) + - [ ] [JavaScript Scoping and Hoisting](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) > 务必自己总结规则! From 72507ed77e3f26745a3789f14e4bf564da3ccb4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=AF=A1?= Date: Tue, 14 Sep 2021 21:53:52 +0800 Subject: [PATCH 3/6] =?UTF-8?q?JavaScript=E5=8F=98=E9=87=8F=E6=8F=90?= =?UTF-8?q?=E5=8D=87&=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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0869fd8..3418f6f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ 成功采纳后,如果你面试遇到其他问题,笔者可以提供免费解答服务。 -### 变量提升 +### 变量提升&变量提升 > 变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 From d86bf6267c26b025167d73c38e879e6d35f8a7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=AF=A1?= Date: Tue, 14 Sep 2021 22:03:30 +0800 Subject: [PATCH 4/6] =?UTF-8?q?JavaScript=E5=8F=98=E9=87=8F=E6=8F=90?= =?UTF-8?q?=E5=8D=87&=E5=87=BD=E6=95=B0=E6=8F=90=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3418f6f..7a15038 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ 成功采纳后,如果你面试遇到其他问题,笔者可以提供免费解答服务。 -### 变量提升&变量提升 +### 变量提升&函数提升 > 变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 @@ -53,6 +53,14 @@ var Gangster = "我是变量的值"; console.log(Gangster); // 我是变量的值 ``` +用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有JavaScript执行到当前变量声明这句语句时,才能使用这个变量。 +```js +console.log(yck) // undefined +var yck='大佬'; + +console.log(typeof yck) //ReferenceError +let yck='大佬'; +``` - [ ] 文档 - [ ] [JS 变量提升](https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting) - [ ] 推荐文章 From 1a996aa4121f888d76a0dc01bd119fef2633ac9c Mon Sep 17 00:00:00 2001 From: rudy-lc Date: Tue, 14 Sep 2021 14:38:00 +0000 Subject: [PATCH 5/6] Commit from GitHub Actions (markdown-autodocs) --- README.md | 57 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 8f5a773..3a6bcc8 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ JS 数据类型分为两大类及八种数据类型,注意别漏了 ES6 新增 ### 作用域 作用域是指程序中定义变量的区域,该位置决定了变量的生命周期,也就是变量和函数的可访问范围。 + - [ ] 文档 - [ ] [作用域](https://developer.mozilla.org/en-US/docs/Glossary/Scope) - [ ] [块作用域](https://developer.mozilla.org/en-US/docs/Glossary/Block/Scripting) @@ -138,52 +139,58 @@ JS 数据类型分为两大类及八种数据类型,注意别漏了 ES6 新增 - [ ] 推荐文章 - [ ] [JS 的 new 到底是干什么的?](https://zhuanlan.zhihu.com/p/23987456) - [ ] [JavaScript 深入之 new 的模拟实现](https://github.com/mqyqingfeng/Blog/issues/13) - + ### 变量提升&函数提升 -> 变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 +> 变量提升(Hoisting)被认为是, Javascript 中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 -为什么会出现变量提升? 因为JavaScript在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 +为什么会出现变量提升? 因为 JavaScript 在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 我们声明一个函数的时候如果在声明函数的前面调用这个函数也是可以执行的,因为这个函数在解析的时候函数声明会被移至其作用域的顶部 。函数提升只提升函数声明,不会提升函数表达式。 + ```js // 普通函数声明 -console.log(Gangster("yck")) // yck undefined +console.log(Gangster("yck")); // yck undefined function Gangster(name) { - console.log(name); -} -``` -```js -// 声明式函数 -console.log(Gangster("yck")) // Gangster is not a function -var Gangster = function (name) { console.log(name); } ``` -在变量赋值前,函数声明依旧是函数声明,当变量赋值后,函数声明被会被相同名字的变量覆盖,所以说函数提升的优先级大于变量提升 + ```js -function Gangster(){ - console.log("大佬"); +// 声明式函数 +console.log(Gangster("yck")); // Gangster is not a function +var Gangster = function (name) { + console.log(name); }; -console.log(Gangster); // Function: Gangster -Gangster(); // 大佬 -var Gangster = "我是变量的值"; -console.log(Gangster); // 我是变量的值 ``` -用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有JavaScript执行到当前变量声明这句语句时,才能使用这个变量。 +在变量赋值前,函数声明依旧是函数声明,当变量赋值后,函数声明被会被相同名字的变量覆盖,所以说函数提升的优先级大于变量提升 + ```js -console.log(yck) // undefined -var yck='大佬'; - -console.log(typeof yck) //ReferenceError -let yck='大佬'; +function Gangster() { + console.log("大佬"); +} +console.log(Gangster); // Function: Gangster +Gangster(); // 大佬 +var Gangster = "我是变量的值"; +console.log(Gangster); // 我是变量的值 ``` + +用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有 JavaScript 执行到当前变量声明这句语句时,才能使用这个变量。 + +```js +console.log(yck); // undefined +var yck = "大佬"; + +console.log(typeof yck); //ReferenceError +let yck = "大佬"; +``` + - [ ] 文档 - [ ] [JS 变量提升](https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting) - [ ] 推荐文章 - [ ] [JavsScript 变量提升和函数提升](https://towind.fun/2021/05/10/js-hoisting/) - - [ ] [JavaScript的执行上下文](https://www.huaweicloud.com/articles/b0e28ae85a6f6d4e4e28824a94d17b51.html) + - [ ] [JavaScript 的执行上下文](https://www.huaweicloud.com/articles/b0e28ae85a6f6d4e4e28824a94d17b51.html) - [ ] [JavaScript Scoping and Hoisting](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) ### Class(类) From a6dd12d3afa4a4cbe085ab33327323d38815c561 Mon Sep 17 00:00:00 2001 From: yck Date: Tue, 14 Sep 2021 23:03:00 +0800 Subject: [PATCH 6/6] Update README.md --- README.md | 50 ++++---------------------------------------------- 1 file changed, 4 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 3a6bcc8..57cb80a 100644 --- a/README.md +++ b/README.md @@ -140,57 +140,15 @@ JS 数据类型分为两大类及八种数据类型,注意别漏了 ES6 新增 - [ ] [JS 的 new 到底是干什么的?](https://zhuanlan.zhihu.com/p/23987456) - [ ] [JavaScript 深入之 new 的模拟实现](https://github.com/mqyqingfeng/Blog/issues/13) -### 变量提升&函数提升 +### 变量提升 -> 变量提升(Hoisting)被认为是, Javascript 中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。例如,从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。 - -为什么会出现变量提升? 因为 JavaScript 在运行的时候会有 编译和和执行两个过程,在它编译的时候,会对全局进行搜索,所有的变量和函数声明会被移至其作用域的顶部,而其它的语句不会改变它们的顺序,所以在编译阶段,先执行了变量的声明。 - -我们声明一个函数的时候如果在声明函数的前面调用这个函数也是可以执行的,因为这个函数在解析的时候函数声明会被移至其作用域的顶部 。函数提升只提升函数声明,不会提升函数表达式。 - -```js -// 普通函数声明 -console.log(Gangster("yck")); // yck undefined -function Gangster(name) { - console.log(name); -} -``` - -```js -// 声明式函数 -console.log(Gangster("yck")); // Gangster is not a function -var Gangster = function (name) { - console.log(name); -}; -``` - -在变量赋值前,函数声明依旧是函数声明,当变量赋值后,函数声明被会被相同名字的变量覆盖,所以说函数提升的优先级大于变量提升 - -```js -function Gangster() { - console.log("大佬"); -} -console.log(Gangster); // Function: Gangster -Gangster(); // 大佬 -var Gangster = "我是变量的值"; -console.log(Gangster); // 我是变量的值 -``` - -用 `var` 声明变量时会将声明提升到函数或全局作用域的顶部。但是 `let` 或者 `const`,会将声明放进 TemporalDeadZone,简称 TDZ(暂时性死区),只有 JavaScript 执行到当前变量声明这句语句时,才能使用这个变量。 - -```js -console.log(yck); // undefined -var yck = "大佬"; - -console.log(typeof yck); //ReferenceError -let yck = "大佬"; -``` +变量提升(Hoisting)可以将变量和函数在编译阶段放入内存,从而在执行阶段时在声明前使用。 - [ ] 文档 - - [ ] [JS 变量提升](https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting) + - [ ] [JS 变量提升](https://developer.mozilla.org/en-US/docs/Glossary/Hoisting) - [ ] 推荐文章 - [ ] [JavsScript 变量提升和函数提升](https://towind.fun/2021/05/10/js-hoisting/) - - [ ] [JavaScript 的执行上下文](https://www.huaweicloud.com/articles/b0e28ae85a6f6d4e4e28824a94d17b51.html) + - [ ] [我用了两个月的时间才理解 let](https://fangyinghang.com/let-in-js/) - [ ] [JavaScript Scoping and Hoisting](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) ### Class(类)