声明变量关键字:var、let、const的区别

  • var关键字
  • let关键字
    • 1、暂时性死区
    • 2、全局声明
    • 3、for循环中的let声明
  • const关键字
  • 使用建议
    • 1、尽量不使用var
    • 2、优先使用const,再考虑let

var关键字

定义一个变量:var操作符,后跟变量名。

var message;

这里定义了一个名为message的变量,可以用它来保存任何类型的值。
未初始化的情况下,变量保存一个特殊值undefined。

var声明的范围是函数作用域

当在一个函数内用var定义变量时,该变量将在函数退出时销毁:

function foo() {var message = 2;
}
foo();
console.log(message);//ReferenceError: message is not defined

即在函数外部访问不到函数内部var定义的变量。

使用var声明的变量会自动提升到函数作用域顶部:

function foo() {console.log(a);var a = 20;
}
foo();//undefined

等价于:

function foo() {var a;console.log(a);a = 20;
}
foo();//undefined

let关键字

与var关键字不同的是,let声明的范围是块作用域

if (true) {let message = 20;console.log(message);//20
}
console.log(message);//ReferenceError: message is not defined

1、暂时性死区

和var相比,let声明的变量不会被提升到函数作用域顶部:

console.log(message);//ReferenceError: message is not defined
let message = 20;

在let声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出RefenenceError。

2、全局声明

和var相比,let在全局作用域中声明的变量不会成为window对象的属性,而var声明的变量会(需在浏览器中运行):

var messageVar = 20;
console.log(window.messageVar);//20let messageLet = 21;
console.log(window.messageLet);//undefined

3、for循环中的let声明

对比for循环中的var与let:

for (var i = 0; i < 5; i++) {setTimeout(() => console.log(i), 0);
}
//5、5、5、5、5
for (let j = 0; j= < 5; j++) {setTimeout(() => console.log(j), 0);
}
//0、1、2、3、4

var中,在退出循环时,迭代变量保存的是退出循环的值:5,在执行超时逻辑时,所有的i都是同一个变量,所以输出同一个值;

let中,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量,所以每个setTimeout引用的是不同的变量实例,即输出我们期望的值。

const关键字

const与let基本相同(为块作用域),区别为const声明变量的同时必须初始化而且不能够修改const声明的变量的值,否则会导致运行错误。

const声明的限制只适用于它指向变量的引用,即如果const声明的是一个对象,那么修改这个对象内部的属性是允许的:

const message = {};
message.key = '123'//OK

不能用const来声明迭代变量(因为迭代变量会改变),如果只用const声明一个不改变的for循环变量是可以的。

使用建议

1、尽量不使用var

限制自己使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

2、优先使用const,再考虑let

使用const可以让浏览器运行时保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。

声明变量关键字:var、let、const的区别相关推荐

  1. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  2. php变量和js变量的区别吗,JS声明变量的3种方式和区别

    JavaScript 是弱类型语言,可以不需要声明变量而直接使用.这样虽然简单但不易发现变量名方面的错误,所以不建议这样做.通常的做法是在使用 JavaScript 变量前先声明变量.目前,JavaS ...

  3. 前端开发:JS中let、var和const的区别详解

    前言 前端开发过程中,JS声明变量的关键字想必开发者都不陌生,而且使用的频率在前端开发过程中也是数一数二的.JS中声明变量的关键字有三个let.var和const,但是三者的使用对比和区别也是非常重要 ...

  4. Var let const 的区别

    Var let const 的区别 变量提升 var 存在变量提升 变量可以在声明之前调用 但是值为undefined. let ,const 不存在变量提升.他们声明的变量必须在声明后调用 如果在之 ...

  5. Js中var,let,const的区别

    一:区别: 1.var声明的变量属于函数作用域,而let和const声明的变量属于块级作用域:(js作用域在上篇文章) 2.var声明的变量存在变量提升,而let和const没有 3.var声明的变量 ...

  6. 红宝书系列之 var let const 的区别

    目录 声明风格及最佳实践 var 关键字 1. var 使用 2. var 声明作用域 3. var 声明提升 let 声明 1. let 作用域 2. 暂时性死区 3. 全局声明(网易前端笔试题) ...

  7. 微信小程序var,let,const的区别

    var 用var的方式声明的变量,为全局变量 let 声明块级变量,即局部变量 const 用于声明常量,也具有块级作用域 const PI=3.14;

  8. 关键字—final static const的区别

    关键字 解释 修饰类 修饰方法 修饰变量 final:终态 这个关键字的含义是"这是无法改变的"或者"终态的": 这个类不能被继承,这个类的所有方法都是fina ...

  9. mysql声明变量关键字_声明变量的关键字

    查询查看: 静态关键字static   同时在类中声明常量的关键字( 关键字final) 静态关键字static的作用 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内 ...

  10. ES6——let、const和var的用法和区别

    ES6 新增了let命令,用来声明变量,新增了const命令,用来声明常量,它们的用法类似于var. let a = 1; var b = 2; const PI = 3.14; 主要区别 块级作用域 ...

最新文章

  1. 信号、系统与滤波器设计(matlab)
  2. MobX快速入门教程(重要概念讲解)
  3. dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
  4. 我两小时学完指针,你学会数组/指针与函数需要多久?
  5. 软件测试的基础知识(六)
  6. Linux 驱动之内核定时器
  7. Scala学习07——隐式转换
  8. [C# 网络编程系列]:TCP编程
  9. php 过滤绕过注入,PHPB2B注入#1(绕过过滤)
  10. 计算机毕业设计(附源码)python兴澜幼儿园管理系统
  11. 局域网中的通信协议及选择简述。
  12. 常见的网上商城系统开发语言有哪些?
  13. 20164305徐广皓 - Exp1 PC平台逆向破解(5)M
  14. 计算机二级考试题库vb知识点,国家计算机二级考试题库 VB上机试题第13套
  15. springboot项目部署到服务器第三步部署java环境(最白教程)
  16. Not registered via @EnableConfigurationProperties or marked as Spring component
  17. 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...
  18. CCleaner 下载使用
  19. 基于qt:五子棋游戏
  20. linux系统开机过程

热门文章

  1. python画图配色_python matplotlib包图像配色方案
  2. matlab 收敛速度,BP网络的收敛速度和设计步骤【转】
  3. Python 网页爬取图片
  4. UNI-APP前后端实战课《悦读》
  5. java new什么意思_java里的new到底是什么意思?
  6. 关于需求响应式公共交通的那些事(上)
  7. NDoc1.3.1使用手册
  8. java 读取手机sd卡_获取Android手机中SD卡内存信息
  9. 抛物线公式即辛卜生(Simpson)公式的数值积分的Python程序
  10. 数值积分——梯形公式和Simpson公式