ES6 变量和函数参数的临时死区

更新日期: 2019-07-22阅读: 2k标签: 变量

ES6的第一章便是讲新增了let和const这两个变量,可以用于定义块级作用域的变量。相对于于var定义的变量,由let和const定义的变量作用域不会被提升。但是值得注意的是,由let和const定义的变量还拥有一个会让人恨容易犯错的特性:临时死区(Temporal Dead Zone,下文以TDZ简称)。但是拥有TDZ的不仅是变量,函数的参数也有,接下来就一一讲解。


一:变量的临时死区

例1:在变量的作用域外引用变量

function testTdz() {
    console.log(colour);
    if(1 === 1){
        let colour = 'blue';
    }
}
testTdz(); //undefined

例2:在变量的临时死区内引用变量

function testTdz() {
    if(1 === 1){
        console.log(colour);
        let colour = 'blue';
    }
}
testTDZ(); // Uncaught ReferenceError: Cannot access 'colour' before initialization

例3: 在变量作用域且初始化之后引用变量

function testTdz() {
    if(1 === 1){
        let colour = 'blue';
        console.log(colour);
    }
}
testTdz();//'blue'

以上的三个例子,例2展示了在变量的临时死区内引用变量会导致抛出错误。再结合这三个例子我可以准确地定义出变量的临时死区的区域为:

1: 在变量的作用域内
2: 在变量的定义之前

如果以一张图来表示的话,就是下图所示,框起来的区域:

这里需要特别注意的是,我们在if表达式里面定义colour变量,那么它的作用域就只是在if表达式的大括号里面。在testTdz()方法内,if表达式大括号外的区域不是colour的作用域,那就一定不是它的临时死区,在这些地方引用colour变量,是不会造成抛错的,只是变量的值是undefined,这也是上面的例1所展示的道理。


二:函数参数的临时死区
我们在定义函数参数的时候,其实在背后,这些参数就如同用let定义的变量一样,拥有自己的作用域。这些参数变量在初始化之前,如果被引用,也会抛出错误。当我们调用函数,会通过参数的传值或者默认值初始化这些参数。为了理解函数参数的临时死区特性,我们先来看一个正确使用函数参数的例子:
例1:

function testFunctionTdz(first, second = first + 1) {
    console.log(`first: ${first} || second: ${second}`);
}
testFunctionTdz(1); //first: 1 || second: 2
testFunctionTdz(1, 1); //first: 1 || second: 1

当我们执行testFunctionTdz(1)的时候,实际上背后的执行代码是:

let first = 1;
let second = first + 1; // 1 + 1

当我们执行testFunctionTdz(1, 1) 的时候,实际执行的代码是:

let first = 1;
let second = 1;

所以上面的两个调用都可以正常地调用下去。接下来我们稍微改造一下上面的代码,看一个在参数的临时死区引用变量,从而导致程序抛错的例子:

function testFunctionTdz(first = second + 1, second) {
    console.log(`first: ${first} || second: ${second}`);
}
testFunctionTdz(1, 1); // first: 1 || second: 1
testFunctionTdz(undefined, 1); // Uncaught ReferenceError: Cannot access 'second' before initialization

在这个例子,当我们执行testFunctionTdz(undefined, 1)时,背后的代码实际上是:

let first = second; //在这个区域,就是变量second的临时死区,所以会导致程序抛错
let second = 1;

以上就是变量和函数参数的临时死区的内容,自认为应该是讲得十分清楚了。

来自:https://segmentfault.com/a/1190000019838023


链接: https://fly63.com/article/detial/4320

css自定义变量_初次接触CSS变量

本文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。

CSS变量(自定义属性)实践指南

Sass和Less这样的预处理器,让我们的CSS代码保持良好的结构和可维护性。像变量、混合(mixins)、循环控制等特性,增强了动态编写CSS的能力,从而减少重复代码,也加快了我们开发速度。

css变量_原生css 中变量的使用

原生css 中变量的使用,这个重要的 CSS 新功能,所有主要浏览器已经都支持了。本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大。声明变量的时候,变量名前面要加两根连词线(--),var()函数用于读取变量。

理解var let const区别

JavaScript中var、let、const区别?js中let和const都是es5版本新的命名规范,在此之前定定义一个变量只能用var。我们可以把let和const看做是为了弥补var的一些不足而新设计出来的

一个例子,变量提升和函数提升就是这么简单!

引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。

CSS变量使用解析

很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容),最近发现主流浏览器都已经支持了这一变化,CSS变量就像JS的变量,每个类名或者花括号就像一个function,里面的变量只有上下文以内可以获取,这就让CSS有了更多可能性。

let与var的区别,为什么要用let?

var是全局声明,let是块级作用的,只适用于当前代码块;var变量会发生变量提升,let则不会进行变量提升;var 会造成重复赋值,循环里的赋值可能会造成变量泄露至全局

ES6-变量的解构赋值

解构赋值官方解释:按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。变量的解构赋值就是一种写法,掌握了这种写法可以让我们在书写 javascript 代码时可以更加的简单,迅捷。

JS中变量的存储

JS中的变量是保存在栈内存中的:1.基本数据类型的值直接在栈内存中存储;2.值与值之间是独立存在的,修改一个变量不会影响其他变量;对象是保存到堆内存中的,每创建一个新的对象

js 交换变量值的方法总汇

这篇文章总结七种办法来交换a和b的变量值 。最最最简单的办法就是使用一个临时变量了 ,最后我的方案是利用了ES6的解构赋值语法 ,它允许我们提取数组和对象的值,对变量进行赋值

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!