JS 暂时性死区「建议收藏」

JS 暂时性死区「建议收藏」JS暂时性死区ES6暂时性死区引用ES6暂时性死区只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。vartmp=123;if(true){tmp=’abc’;//ReferenceErrorlettmp;}上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后…

大家好,又见面了,我是你们的朋友全栈君。

JS 暂时性死区

ES6 暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var tmp = 123;

if (true) { 
   
  tmp = 'abc'; // ReferenceError
  let tmp;
}

上面代码中,存在全局变量 tmp,但是块级作用域内let又声明了一个局部变量 tmp,导致后者绑定这个块级作用域,所以在 let 声明变量前,对 tmp 赋值会报错。

ES6 明确规定,如果区块中存在 letconst 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

if (true) { 
   
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

上面代码中,在 let 命令声明变量 tmp 之前,都属于变量 tmp 的“死区”。

“暂时性死区”也意味着 typeof 不再是一个百分之百安全的操作。

typeof x; // ReferenceError
let x;

上面代码中,变量 x 使用 let 命令声明,所以在声明之前,都属于 x 的“死区”,只要用到该变量就会报错。因此,typeof 运行时就会抛出一个 ReferenceError

作为比较,如果一个变量根本没有被声明,使用 typeof 反而不会报错。

typeof undeclared_variable // "undefined"

上面代码中,undeclared_variable 是一个不存在的变量名,结果返回“undefined”。所以,在没有 let 之前,typeof 运算符是百分之百安全的,永远不会报错。现在这一点不成立了。这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错。

有些“死区”比较隐蔽,不太容易发现。

function bar(x = y, y = 2) { 
   
  return [x, y];
}

bar(); // 报错

上面代码中,调用 bar 函数之所以报错(某些实现可能不报错),是因为参数 x 默认值等于另一个参数 y,而此时 y 还没有声明,属于“死区”。如果 y 的默认值是 x,就不会报错,因为此时 x 已经声明了。

function bar(x = 2, y = x) { 
   
  return [x, y];
}
bar(); // [2, 2]

另外,下面的代码也会报错,与 var 的行为不同。

// 不报错
var x = x;

// 报错
let x = x;
// ReferenceError: x is not defined

上面代码报错,也是因为暂时性死区。使用 let 声明变量时,只要变量在还没有声明完成前使用,就会报错。上面这行就属于这个情况,在变量 x 的声明语句还没有执行完成前,就去取 x 的值,导致报错” x 未定义“。

ES6 规定暂时性死区和 letconst 语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。

总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

引用

ECMAScript 6 入门——阮一峰

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147432.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webstorm 快捷键

    webstorm 快捷键最近一段时间在写javascript时,找到一个灰常强悍的IDE。名称叫:WebStorm目前是英文版的,功能很强大。我也在慢慢摸索之中,现把它的一些常用的快捷键列出来,供使用者参考。1.ctrl+shift+n:打开工程中的文件,目的是打开当前工程下任意目录的文件。2.ctrl+j:输出模板3.ct

    2022年6月23日
    32
  • 雷塞控制器SMC304简单介绍

    雷塞控制器SMC304简单介绍                           SMC304运动控制器                                                                                            2018.3产品概述:        SMC304控制器(BASIC版):基于嵌入式…

    2022年6月3日
    56
  • 最新最全 VSCODE 插件推荐(2022版)

    最新最全 VSCODE 插件推荐(2022版)文章目录一、主题及图标GitHubThemeMaterialThemeMaterialIconThemevscode-icons二、功能强化settingssyncwakatimePolacodeChinese(Simplified)LanguagePackforVisualStudioCode三、Git集成插件GitHubPullrequestsGitGraphCodeStream:GitHub,GitLab,BitbucketPRsandCodeReview

    2022年7月25日
    61
  • ps基础快捷键_ps确定的快捷键

    ps基础快捷键_ps确定的快捷键ps快捷键常用表,ps快捷键大全!天下武功,唯快不破!看完这篇PS快捷键使用指南,帮你掌握最常用的32个Photoshop快捷键!注:左上为Mac快捷键,右上为PC快捷键1、Command+T:自由变形该快捷键,主要对图层进行旋转、缩放等变形调整,同时可以拖动修改图层在画面中的位置,是极为常用的功能键。2、Command+J:复制图层对图层的复制,一般的操作是通过图层菜单栏选择,或者…

    2022年9月29日
    2
  • Eclipse乱码解决办法「建议收藏」

    Eclipse乱码解决办法「建议收藏」
    转载于:http://developer.51cto.com/art/200906/126861.htm
     
    1、eclipse的编码不能改成GBK
    解决办法:
    gedit/var/lib/locales/supported.d/zh
    加入这一行:
    zh_CN.GBKGBK
    保存之后再启动eclipse,就可以把编码改成GBK了,不过还是要手工输入,不能选。
    2、在eclipse有中文的文件保存为乱码

    2022年5月25日
    31
  • origin绘图过程的一些经验

    origin绘图过程的一些经验1.在“帮助->learningcenter”选项卡中可以查找教程及下载APP2.如果不小心将工具栏拖到了屏幕中间或者不小心删除了某个工具栏,可以在“查看->工具栏->重新初始化”里边进行重置工具栏。3.图像数字化(Digitize从图上扣点):工具栏上的位置在“查看(V)”的V字右下边,点击之后选择需要扣点的图片位置,即可打开图片进行扣点或者扣线。需要旋转的可以点击“旋转图像”再点下边出现的微旋按钮将图片旋转,然后移动刚刚打开的图片上的四条线使其对齐坐标轴上下边界,输入坐标轴

    2022年5月31日
    74

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号