一、解析过程

js运行前会有编译解析过程,有些错误会在编译过程中被发现。

<body><script>var web = 'yooo';console.log(web);var class = 'alison';</script>
</body>

二、变量提升

<body><script>console.log(web);var web = 'yooo';</script>
</body>

为什么不会报错?

因为在解析阶段进行了变量提升,变量初始化=定义+赋值,浏览器将定义部分提升到了console.log之上。即变量可以在定义之前使用,值为undefined。上面代码相当于如下。

<body><script>var web;console.log(web);web = 'yooo';</script>
</body>

再举一个函数的例子

<body><script>function hd() {if (false) {var web = 'yooo';}console.log(web);}hd();</script>
</body>

依旧不会报错,道理同上,上面代码相当于如下。

<body><script>function hd() {var web;if (false) {web = 'yooo';}console.log(web);}hd();</script>
</body>

但这是js一个不好的习惯,会包容很多缺点,导致实际与预期不符。

如何克服?使用let/const初始化变量

三、let&const暂时性死区TDZ

将var声明改成let/const后,变量提升消失,控制台报错。

<body><script>console.log(web);let web = 'yooo';</script>
</body>
<body><script>console.log(web);const web = 'yooo';</script>
</body>

为什么会报错?

因为在let/const声明变量之前使用该变量,会产生一个暂时性死区TDZ,必须在声明之后才能使用。


再举一个函数的例子

<body><script>let web = 'yooo';function func() {console.log(web);let web = 'yoo';}func();</script>
</body>


为什么报错?

当函数体内未定义变量web,则去函数体外找;若在函数体内定义了web变量,则必须在执行语句前定义。

即因为在块级作用域内有let/const定义了局部变量web,该块级作用域形成封闭,之前let声明的全局变量web就不起作用了。


再举一个函数参数的例子

<body><script>function run(a = b, b = 3) { }run();</script>
</body>

为什么报错?

因为给a赋值b时,b未进行变量初始化,因此产生了一个临时性死区TDZ

如下则不会报错。

<body><script>function run(a = 3, b = a) { }run();</script>
</body>

JS:变量提升与临时性死区TDZ相关推荐

  1. 【学习总结】JS变量提升

    JS的执行机制:先编译,再执行. JS变量提升:指在JS代码的编译阶段,JS引擎会把变量的声明部分和函数的声明部分提升到代码开头的"行为".变量被提升后会给变量设置默认值undef ...

  2. JS---对var,let变量提升和暂时性死区(TDZ)的理解

    一.var和let声明的变量所属作用域不同 var声明的变量属于函数作用域,而let声明的变量属于块级作用域 二.var和let声明的变量所属作用域不同,相应的变量提升也不同 var声明的变量 在函数 ...

  3. let/const 的变量提升与暂时性死区

    从一道面试题说起 请说出 let,const,var 的区别 大部分的回答是这样的,甚至很多博客中的答案也是这样的: let/const 提供了块级作用域 let 不能重复定义 var 有变量提升,l ...

  4. js变量提升_学习笔记:JS中的作用域和预解析

    知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...

  5. js 变量提升 函数提升 作用域

    再说这个知识点前,我们先了解下javascript语言的本质.简单来说js是一个脚本语言,是介于标记语言(例html中使用的标签<.. /> 等是一种被动的,被用来浏览\显示的,无行动能力 ...

  6. Javascript变量提升与暂时性死区

    暂时性死区:在ES6之前,使用 typeof 运算符操作一个未声明的变量时,不会报错,该变量的值以 undefined 作处理.而在ES6之后,使用ES6的变量声明方法(let, const, cla ...

  7. JS变量提升和函数提升的顺序

    1.变量的提升: 变量名会提升到 '当前作用域' 顶部,此时该变量为undefined,未赋值,赋值是在js原位置. console.log(a); // undefined var a = 10 c ...

  8. 什么是js变量提升?

    前言 变量提升实际上很容易理解,就是说在任何位置所声明的变量或函数,都会自动"提"到最前面,就好像它们是在函数的开头声明的一样,我们来看一下具体的代码: //在正常的情况下我们声明 ...

  9. js变量提升hoisting

    作用域(Scoping) 什么是作用域? 我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全 ...

最新文章

  1. 仓库货位卡标识牌_仓储管理中的货位与标识管理
  2. 医院选址问题--数据结构课程设计
  3. Python程序设计题解【蓝桥杯官网题库】 DAY10-算法训练
  4. CKEditor代码高亮显示插件Code Snippet安装及使用方法
  5. 前去哪儿产品总监白羽:做SaaS产品需要注意哪些坑?
  6. r perl python电脑要求_Shell Perl Python 介绍
  7. 燃气灶电气线路图及原理_一位造价大神的电气工程造价知识整理笔记_深圳电气造价预算培训要多少钱...
  8. respondsToSelector的相关使用
  9. linux 内核块设备驱动,你了解Linux 块设备驱动?
  10. 推荐几个不错的技术公众号
  11. 被国人误传了几千年的八句俗语
  12. html制作清明上河图
  13. 联想拯救者Y7000p拆机换压条(轴盖)
  14. android webview 清除缓存,Android webView 缓存处理
  15. CATIA 版本代号的含义
  16. 数据库连接池原理之手写
  17. Axure RP10——值得信赖的强大的原型制作工具,无需编写代码即可创造无限可能
  18. 程序员的职业危机是什么?一个12年互联网人的4点思考
  19. 能定位的不仅GPS,还有它!
  20. JQuery源码分析之—— 整体构架

热门文章

  1. 第21节--非线性回归(下)
  2. template的使用,泛式编程
  3. 搜狗泛站怎么做?搜狗泛域名泛目录收录方法
  4. 使用PreTranslateMessage(MSG* pMsg)截获键盘数字键
  5. (转)常用的js代码
  6. 阿里云Landing Zone系列--场景说明
  7. linux系统宝塔安装nodejs,基于debian宝塔面板安装nodebb – 一款基于Node.js的论坛程序...
  8. Quectel EC20 获取 MCC,MNC,APN
  9. 图像处理之_ARToolKit自定义Marker
  10. 计算机毕业设计ssm农贸市场摊位管理系统c22ux系统+程序+源码+lw+远程部署