var、let和const区别

变量提升问题

  • var声明的变量存在变量提升,而let与const声明的变量不存在变量提升,但存在暂时性死区

  • 即在预编译阶段,js引擎扫描代码时,遇到变量声明,会把var声明提到作用域的顶端,而 let和const声明,则会被放在暂时性死区中。访问暂时性死区中的变量,会触发运行时错误,只有执行变量声明语句后,变量才会从暂时性死区中移除,才可正常访问

重复定义问题

  • var声明的变量可以重复定义

  • let与 const声明的变量,在同一作用域下不可重复声明,否则报错

全局变量问题

  • var声明的变量可能会覆盖全局变量

  • 而let与 const声明的变量只可能会遮住全局变量,不会覆盖全局变量,也就是不会破坏全局作用域

作用域的问题

  • 在ES6之前,只存在全局作用域、 函数作用域,使用 var声明变量,可能会出现内部变量覆盖外部变量的情况,并且循环变量会泄漏为全局变量,还有在ES5中规定,函数声明只能在全局作用域或者函数作用域中进行,但浏览器为了兼容旧代码,不会报错

  • 在ES6中,除了全局作用域、函数作用域,引入了 块级作用域的概念,如我们常见的 {}、if{}、for(){} 都会形成块级作用域

  • 在严格模式下,函数声明语句的行为类似于let,在块级作用域之外不可引用,并且会被提升至块级作用域的顶部,如果是let定义的函数表达式,不会被提示

  • 在非严格模式下,为了兼容旧代码,最终的函数声明语句的行为类似 var, 声明会被提升到外围函数或全局作用域的顶部,而不是代码块的顶部

  • 在使用 let、 const声明变量时,循环变量不会泄漏成为全局变量,在for循环中,设置循环变量与循环体内部是两个单独的作用域,还可以在块级作用域中进行函数声明,需要注意的是,块级作用域必须存在

let与 const的主要区别

  • const声明的是常量,在声明后,常量指向的内存地址中保存的数据不可改动
  • 对于简单类型的数据,如数值、字符串等,声明后不可在修改
  • 对于引用类型的数据,只要保持指针不变即可

var、let和const区别的更多相关文章

  1. JS中const、var 和let的区别

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...

  2. var、let 及 const 区别

    var console.log(a) // undefined var a = 1 从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的 ...

  3. let、var、const区别(表格比较)

    let.var.const区别(表格比较): 区别项 let var const 作用域 块级作用域 全局作用域或函数作用域 块级作用域 是否有变量提升 无 有 无 是否可重复声明 不可 可以 不可 ...

  4. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  5. var和let/const的区别

    let和const是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var有许多不同,并且let和const也有一些细微的不同,再认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节. ...

  6. var, let ,const区别

    ES6中加入了let,const字符,先说说新的区别: 作用域:let 声明的变量只在它所在的代码块内有效,而且不存在变量提升,即变量可以在声明之前使用,值为undefined.let未声明变量前会报 ...

  7. es6的let与es5的var定义变量的区别

    es6的let与es5的var定义变量的区别 自身新手第一次接触let关键字的时候,不知道let与var的区别,本能认为是一样,但非如此,比如下述的代码运行就会报错: let hello = 'hel ...

  8. JS的var和let的区别(详细讲解)

    let是ES6新增的,它主要是弥补var的缺陷,你也可以把let看做var的升级版.下面我就来详细讲讲var和let的区别 相同点: var和let都有函数级作用域 不同点: (1)var是全局作用域 ...

  9. 简述C#中关键字var和dynamic的区别

    C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...

随机推荐

  1. Note -「计算几何」模板

      尚未完整测试,务必留意模板 bug! /* Clearink */ #include <cmath> #include <queue> #include <cstdi ...

  2. 基于myscript.js的web手写板(支持中文识别)

    网上的手写板模板不少,但是支持中文识别的却不多,而且基本上都收费的,毕竟别人的中文库凭什么免费提供给你(说好的开源呢?说好的开源呢? ←_←) 好了,进入主题,myscript.js,在官网其实我并没 ...

  3. MyBatis缓存Cache包

    Mybatis默认使用了一级缓存为数据查询提供效率,其底层数据结构为PerpetualCache.同时MyBatis不止实现了PerpetualCache,还有其他实现提供其他功能,如下: 可以从UM ...

  4. Linux性能优化之内存性能统计信息

    关于内存的概念及其原理在任何一本介绍操作系统的书本中都可以查阅到. 理论放一遍,在Linux操作系统中如何查看系统内存使用情况呢?看看内存统计信息有哪些维度. 一.内存使用量 详细使用方法,man f ...

  5. React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路

    React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路 这几天在忙着把自己做的项目中的类组件转化为功能相同的函数组件,首先先贴一份该组件类组件的关 ...

  6. 利用SSH隧道加密技术隐蔽C&C通信流量

    在网络攻防博弈中,网络流量特征分析类安全防御措施得到了广泛应用.众多厂商和企业对网络流量进行恶意流量分析检测,从而针对性的采取防御措施,如各级ISP在骨干网络设备上大多采用网络流量分析检测的防御方案. ...

  7. 走进第四范式:决策类AI企业的生存之道

    根据不同的应用领域,人工智能行业可以分为视觉类人工智能.语音及语义类人工智能和决策类人工智能. 通常,我们接触的都是视觉类.语音类的人工智能,它们主要用来帮助人类执行具体任务,例如人脸识别,语音控制等 ...

  8. C语言while循环语句

    循环语句三要素 1.在循环外给循环变量赋初值2.进入循环判断循环变量3.在循环体内修改循环变量,使循环趋近结束 2021-11-02

  9. 携程applo配置

    1.官网文档 https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C% ...

  10. 【AI】AI学习方向

    df