资讯专栏INFORMATION COLUMN

let和const

G9YH / 3497人阅读

摘要:发布自的博客,欢迎大家转载,但是要注意注明出处。另外,该文章收纳在的个人的知识整理仓库,欢迎投稿是在加入的新的变量声明方法,声明变量的方法和类似的功能是声明一个作用域被限制在块级的变量,而声明的变量的作用域只能是全局的或者整个函数块的再举一

发布自Kindem的博客,欢迎大家转载,但是要注意注明出处。另外,该文章收纳在Kindem的个人的 IT 知识整理仓库,欢迎 Star、Fork、投稿
let

let是在ES6加入的新的变量声明方法,let声明变量的方法和var类似:

let a = "hello";
var b = "hello";

let的功能是声明一个作用域被限制在块级的变量,而var声明的变量的作用域只能是全局的或者整个函数块的

function varTest() {
    var x = 1;
    if (true) {
        var x = 2;
        // 2
        console.log(x);
    }
    // 2
    console.log(x);
}

function letTest() {
    let x = 1;
    if (true) {
        let x = 2;
        // 2
        console.log(x);
    }
    // 1
    console.log(x);
}

再举一个例子:

var a = 1;
var b = 2;

if (a === 1) {
    var a = 11;
    let b = 22;

    // 11
    console.log(a);
    // 22
    console.log(b);
}

// 11
console.log(a);
// 2
console.log(b);

另外,如果作用域位于程序的顶层,var会挂载到window上,而let不会:

var a = "a";
let b = "b";

// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);

在相同的函数或块作用域内重新声明同一个变量会引发一个重复定义的SyntaxError

if (x) {
    let foo;
    // SyntaxError
    let foo;
}

letvar都会在声明所在的作用域顶部被创建,这被称为变量提升,但是不同的是var的创建会伴随着一个undefined值,在赋值之后才会改变,而let没有被赋值之前是不会被初始化的,如果在这期间引用let声明的变量,会导致一个ReferenceError,直到初始化之前,该变量都处于暂存死区:

function test() {
    // undefined
    console.log(bar);
    // ReferenceError
    console.log(foo);
    var bar = 1;
    let foo = 2;
}
test();

两个复杂一点的例子:

function test(){
    var foo = 33;
    if (true) {
        // ReferenceError
        let foo = (foo + 55);
    }
}
test();
function go(n) {
    // Object {a: [1,2,3]}
    console.log(n);

    // ReferenceError
    for (let n of n.a) {
        console.log(n);
    }
}
go({a: [1, 2, 3]});
const

const的基本作用是声明一个作用域被限制在块级的常量,其作用域和let一样,基本使用也和let类似,但是const的特点是const声明的值一经创建无法被改变

使用const会创建一个值的只读引用,这意味着const声明的对象本省的引用是无法被改变的,但是其属性是可以被改变的,因为改变其属性并不会引起其引用的变化

下面给出const的一些特性的例子:

基本使用:

const a = "abc";

无法被重复定义:

const a = "abc";
// SyntaxError: Identifier "a" has already been declared
const a = "abc";

声明时就必须赋值:

// SyntaxError: Missing initializer in const declaration
const a;

无法被修改:

const a = "a";
// TypeError: Assignment to constant variable
a = "b";

块级作用域:

if (true) {
    var a = "a";
    const b = "b";
    // a
    console.log(a);
    // b
    console.log(b);
}
// a
console.log(a);
// ReferenceError: not defined
console.log(b);

作用域在程序顶层时不会挂在window对象上:

var a = "a";
const b = "b";

// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97711.html

相关文章

  • varlet/const的区别

    showImg(https://segmentfault.com/img/remote/1460000017757580); let和const是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var有许多不同,并且let和const也有一些细微的不同,再认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节... 博客、前端积累文档、公众号、GitHub 内容: var和let...

    SHERlocked93 评论0 收藏0
  • ES6学习 第一章 let const 命令

    摘要:外层作用域不报错正常输出块级作用域与函数声明规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。规定,块级作用域之中,函数声明语句的行为类似于,在块级作用域之外不可引用。同时,函数声明还会提升到所在的块级作用域的头部。 前言:最近开始看阮一峰老师的《ECMAScript 6 入门》(以下简称原...

    番茄西红柿 评论0 收藏2637
  • javascript 声明变量var、letconst详解及示例

    摘要:概述发布前,只能通过声明变量的方式,常量块级变量函数变量这些概念的差别都不能很好的体现出来,于此同时,加入你要使用或者提供一个,声明的变量可随时被修改和重新分配的问题,会让你时刻担心代码是否能正常运行。 1. var、let、const概述 ES6发布前,Javascript只能通过var声明变量的方式,常量、块级变量、函数变量这些概念的差别都不能很好的体现出来,于此同时,加入你要使用...

    tuomao 评论0 收藏0
  • javascript中var、letconst声明的区别

    摘要:声明的变量存在变量提升,声明的变量不存在变量提升。声明的变量允许重新赋值,声明的变量不允许重新赋值。注意跨脚本声明重复变量也会报错。中出现的任何元素在声明中出现,语法错误。中的是如此的怪异。对中的声明进行实例化。 我在上一篇文章javascript中词法环境、领域、执行上下文以及作业详解中的最后稍微提到了有关var、let、const声明的区别,在本篇中我会重点来分析它们之间到底有什么...

    Yujiaao 评论0 收藏0
  • ES6 系列之 let const

    摘要:块级作用域存在于函数内部块中字符和之间的区域和块级声明用于声明在指定块的作用域之外无法访问的变量。和都是块级声明的一种。值得一提的是声明不允许修改绑定,但允许修改值。这意味着当用声明对象时没有问题报错临时死区临时死区,简写为。 块级作用域的出现 通过 var 声明的变量存在变量提升的特性: if (condition) { var value = 1; } console.lo...

    PascalXie 评论0 收藏0
  • ES6系列之 let const

    摘要:声明的变量不得改变值,这意味着,一旦声明变量,就必须立即初始化,不能留到以后赋值。这在语法上,称为暂时性死区,简称。这表明函数内部的变量与循环变量不在同一个作用域,有各自单独的作用域。系列文章系列文章地址 showImg(https://segmentfault.com/img/bVbrjjC); 为什么需要块级作用域 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合...

    libxd 评论0 收藏0

发表评论

0条评论

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