资讯专栏INFORMATION COLUMN

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

entner / 1368人阅读

摘要:但是值得注意的是,由和定义的变量还拥有一个会让人恨容易犯错的特性临时死区,下文以简称。但是拥有的不仅是变量,函数的参数也有,接下来就一一讲解。

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://www.ucloud.cn/yun/105874.html

相关文章

  • ES6系列文章 块级作用域

    摘要:声明之函数作用域和全局作用域。块级作用域不能重复声明临时性死区等特性用来解决变量存在的种种问题。块级作用域终于在外面访问不到了。一些常量声明使用声明的变量名全部大写。 ES5之前javascript语言只有函数作用域和全局作用域,使用var来声明变量,var声明的变量还存在变量提升使人困惑不已。我们先来复习一下ES5的var声明,再对比学习let和const 。 var var声明之函...

    赵连江 评论0 收藏0
  • 《深入理解ES6》笔记——函数(3)

    摘要:错误的写法错误的写法中的构造函数新增了支持默认参数和不定参数。箭头函数的简单理解箭头函数的左边表示输入的参数,右边表示输出的结果。但是有了尾调用优化之后,递归函数的性能有了提升。 作为前端切图仔,越发觉得自己离不开函数了。 说到JavaScript函数,脑子里都是匿名函数、普通函数、闭包函数、构造函数......然后还能说出一大堆函数的概念。如果你达到这个水平,那么函数对你来说没有难度...

    DoINsiSt 评论0 收藏0
  • ES6系列---函数

    摘要:形参默认值不再影响对象当使用默认参数值时,对象的行为与以往有所不同。具有方法的函数被统称为构造函数。当调用函数的方法时,被赋值为新创建对象实例如果调用方法,则的值为。 由于JavaScript开发者多年的不断抱怨和呼吁,ES6终于大力度地更新了函数特性,在ES5基础上进行了许多改进。 函数形参的默认值 ES5形参默认值的实现 在ES5中,你很可能通过以下这种方式为函数赋予默认值: fu...

    AJie 评论0 收藏0
  • 深入理解ES6笔记(一)块级作用域绑定

    摘要:和都能够声明块级作用域,用法和是类似的,的特点是不会变量提升,而是被锁在当前块中。声明常量,一旦声明,不可更改,而且常量必须初始化赋值。临时死区临时死区的意思是在当前作用域的块内,在声明变量前的区域叫做临时死区。 主要知识点有:var变量提升、let声明、const声明、let和const的比较、块级绑定的应用场景showImg(https://segmentfault.com/img...

    马忠志 评论0 收藏0

发表评论

0条评论

entner

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<