var:

1)声明作用域:在函数内部,使用var定义一个变量(局部变量),在函数被调用完之后,该变量会被立即销毁。在定义变量时如果省略var,就会创建一个全局变量(不建议在局部作用域中定义全局变量,难维护,而且在严格模式下,会导致抛出ReferenceError)。

2)声明提升:把所有变量声明都拉到函数作用域的顶部。

  1. function foo(){
  2. console.log(age);
  3. var age = 18;
  4. }

其实和下面得一样

  1. function foo(){
  2. var age;
  3. console.log(age);
  4. age = 18;
  5. }
  6. foo();//undefined

3)可以反复多次使用var声明同一个变量。

  1. function foo(){
  2. var age = 16;
  3. var age = 1;
  4. var age = 2;
  5. console.log(age);
  6. }
  7. foo();//2

4)全局声明:使用var在全局作用域中声明的变量会成为window对象的属性。

  1. var age = 18;console.log(window.age);//18

let:

1)声明作用域:let声明的是块作用域,而var声明的是函数作用域。块作用域是函数作用域的子集,所以var作用域的限制同时也适用于let。

  1. //var
  2. if(true){
  3. var age = 18;
  4. console.log(age);//18
  5. }
  6. console.log(age);//18
  7.  
  8. //let
  9. if(true){
  10. let age = 18;
  11. console.log(age);//18
  12. }
  13. console.log(age);//ReferenceError:age没有定义

2)声明提升:let声明的变量不会在作用域中被提升

3)不可以在一个块中反复多次使用let声明同一个变量

  1. let age;
  2. let age;//SyntaxError,标识符age已经声明过了

4)全局声明:使用let在全局作用域中声明的变量不会成为window对象的属性,但是var声明的变量会。

  1. let age = 18;
  2. console.log(window.age);//undefined

5)条件声明:在使用var声明变量时,由于声明会被提升,js会自动将多余的声明在作用域顶部合并为一个声明。而因为let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量。因此对于let,不能依赖条件声明模式。

6)for循环中的let声明:在用let声明迭代变量时,js在后台会为每个迭代变量声明一个新的迭代变量,每个setTimeout引用的都是不同的迭代变量。for-in 和for-of都适用。

  1. for(var i=0;1<5;i++){}
  2. console.log(i); //5
  3.  
  4. for(let i=0;1<5;i++){}
  5. console.log(i); //ReferenceError:i没有定义
  1. for(var i=0;1<5;i++){
  2. setTimeout(()=>console.log(i),0);
  3. }
  4. //会输出5,5,5,5,5
  5.  
  6. for(let i=0;1<5;i++){
  7. setTimeout(()=>console.log(i),0);
  8. }
  9. //会输出0,1,2,3,4

const:

1)const的行为和let基本相同,唯一的区别是const它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误(TypeError)。

2)不允许重复声明

3)作用域也是块

4)const声明的限制只适用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

  1. const person = {};
  2. person.name = "dage";

5)不能用const声明迭代变量,因为迭代变量会自增。但是可以声明一个不会被修改的for循环变量。这对for-in 和for-of循环特别有意义。

声明风格及最佳实践:先使用const,let次之,不使用var。

JavaScript var,let,const三个关键字的区别的更多相关文章

  1. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  2. 【前端面试】(四)JavaScript var let const的区别

    视频链接: JavaScript var let const的区别 - Web前端工程师面试题讲解 参考链接: JavaScript 变量 JavaScript Let JavaScript Cons ...

  3. JavaScript var, let, const difference All In One

    JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var ...

  4. php中this,self,parent三个关键字的区别辨析

    php中this,self,parent三个关键字的区别辨析 一.总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用. 1.self关键字使用 ...

  5. JavaScript—var lef const区别

    今天刚刚学JavaScript 因为以前学过.学起来也就轻松.今天在练习.流程控制语句的时候,用WebStrom 写的时候 var 声明变量的时候 下面老是有一条白线.开始以为是开发环境有问题 然后, ...

  6. javascript函数命名的三种方式及区别

    1, function fn(val1,val2) { alert(val1+val2); } fn(1,2); 2, var fn=function() { alert(val1+val2); } ...

  7. final、finally、三个关键字的区别

    一 final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以 ...

  8. java中final,finally,finalize三个关键字的区别

    final 可以作为修饰符修饰变量.方法和类. 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改. 被final修饰的方法不能够在子类中被重写(override): 被 ...

  9. Java中 intValue,parseInt,Valueof 这三个关键字的区别

    intValue()是把Integer对象类型变成int的基础数据类型: parseInt()是把String 变成int的基础数据类型: Valueof()是把给定的String参数转化成Integ ...

随机推荐

  1. MyBatis的一二级缓存

    一级缓存 一级缓存默认是开启的,生命周期和SqlSession相同.一个会话中每次执行一个查询操作时,会先查询二级缓存,如果二级缓存没查到或者二级缓存未开启就会从一级缓存中查询,如果一级缓存也未查到就 ...

  2. flink:JobGraph生成过程分析

    1.JobGraph是由StreamGraph转换而来,当client将StreamGraph提交后,job启动前会先完成转换,统一的转换入口如下: 2.StreamingJobGraphGenera ...

  3. zuul1.x和gateway的区别

    阻塞与非阻塞: 1.实际上是Spring mvc与Spring webflux的区别 转载:https://www.cnblogs.com/lixinjie/p/a-brother-of-spring ...

  4. 03-Python里字符串的常用操作方法二

    1.lstrip():删除左侧空白字符 实例: my_str = ' hello world and my and test and python ' # 原始字符串 print(my_str) # ...

  5. Jmeter-BeanShell断言的运用二(不同Json格式的字段提取和断言判断)

    前言 为了更加熟悉BeanShell,所以用几个实例来记录说明下,不同的Json格式是怎么提取相应字段和判断断言的.(会持续更新...) 一.第一种Json格式 1.Json响应数据内容如下: { & ...

  6. Docker学习—Stack

    前言: 前一篇了解Docker使用Swarm集群部署方式,并创建服务到Swarm集群中:如果在集群部署过程中存在大量服务部署.编排那么该如何处理呢? 那么就需要了解Docker Stack了. 1.D ...

  7. 九. Vuex详解

    1. 理解Vuex 1.1 Vuex功能 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储 管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...

  8. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

  10. 安装centos出现的问题

    1.配置好之后,点击完成,如果出现"无法创建新虚拟机,无法打开配置文件,D:/... ,拒绝访问" 的错误时: 关闭虚拟机,重新以管理员身份打开.