var

console.log(a) // undefined

var a = 1

从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是声明。
对于这种情况,我们可以把代码这样来看

var a

console.log(a) // undefined

a = 1

接下来我们再来看一个例子

var a = 10

var a

console.log(a)
对于这个例子,如果你认为打印的值为undefined那么就错了,答案应该是10,对于这种情况,我们这样来看代码 var a var a a = 10 console.log(a)
到这里为止,我们已经了解了var声明的变量会发生提升的情况,其实不仅变量会提升函数也会被提升。
console.log(a) // ƒ a() {} function a() {} var a = 1
对于上述代码,打印结果会是ƒ a() {},即使变量声明在函数之后,这也说明了函数会被提升,并且优先于变量提升。
说完了这些,想必大家也知道var存在的问题了,使用var声明的变量会被提升到作用域的顶部。

接下来我们再来看letconst

 var a = 1
let b = 1
const c = 1
console.log(window.b) // undefined
console.log(window. c) // undefined function test(){
console.log(a)
let a
}
test()

首先在全局作用域下使用letconst声明变量,变量并不会被挂载到window上,这一点就和var声明有了区别。
再者当我们在声明a之前如果使用了a,就会出现报错的情况, a is not defined

首先报错的原因是因为存在暂时性死区,我们不能在声明前就使用变量,这也是letconst优于var的一点。然后这里你认为的提升和var的提升是有区别的,虽然变量在编译的环节中被告知在这块作用域中可以访问,但是访问是受限制的

总结

  • 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
  • var存在提升,我们能在声明之前使用。letconst因为暂时性死区的原因,不能在声明前使用
  • var在全局作用域下声明变量会导致变量挂载在window上,其他两者不会
  • letconst作用基本一致,但是后者声明的变量不能再次赋值

    2019-03-02  19:28:08

 

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

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

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

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

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

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

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

  4. var和let/const的区别

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

  5. var, let ,const区别

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

  6. var、let和const区别

    var.let和const区别 变量提升问题 var声明的变量存在变量提升,而let与const声明的变量不存在变量提升,但存在暂时性死区 即在预编译阶段,js引擎扫描代码时,遇到变量声明,会把var ...

  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. 两个inline-block中间有空白,解决inline-block 元素之间的空白问题

    目录 一.遇到的问题 二.举个简单的栗子分析问题 三.解决办法 一.遇到的问题 前些天写瀑布流布局的时候,发现明明计算好了宽度使得一行能放下三张图片,实际效果却总是放不下,图片会挤到下一行去.上图: ...

  2. 最短路问题之Bellman-ford算法

    题目: 最短路:给定两个顶点,在以这两个点为起点和终点的路径中,边的权值和最小的路径.考虑权值为点之间的距离. 单源最短路问题,Bellman-ford算法 思路:每次循环检查所有边,可优化. 应用于 ...

  3. MSP430F149串口收发程序的学习(一)

    首先将用到的IO口设置为第二模式: ①使用串口USART0则设置P3.4 P3.5 ,使用USART1则设置P3.6,P3.7 (P3SEL |= BIT3+BIT4:P3SEL |= BIT6+BI ...

  4. Python:黑板课爬虫闯关第四关

    第四关地址:http://www.heibanke.com/lesson/crawler_ex03/ 一开始看到的时候有点蒙,不知道啥意思,说密码需要找出来但也没说怎么找啊. 别急,随便输了个昵称和密 ...

  5. Virtual Box虚拟机Ubuntu系统安装及基本配置

    Linux简介 什么是 Linux? Linux:世界上不仅只有一个 Windows 操作系统,还有 Linux.mac.Unix 等操作系统.桌面操作系统下 Windows 是霸主,而 Linux ...

  6. 版本控制工具——Git常用操作(上)

    本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...

  7. 在ASP.NET Core中构建路由的5种方法

    原文链接 :https://stormpath.com/blog/routing-in-asp-net-core 在ASP.NET Core中构建路由的5种方法 原文链接 :https://storm ...

  8. 0423上课练习(list、while、def)

    """ 循环录入3个正整数,求最大值,最小值,总和,平均值 访问列表中的元素: 列表的长度: len(列表名) 索引值的范围:[0,len(列表名)-1] 列表名[索引值 ...

  9. Android Material Design控件使用(四)——下拉刷新 SwipeRefreshLayout

    使用下拉刷新SwipeRefreshLayout 说明 SwipeRefreshLayout是Android官方的一个下拉刷新控件,一般我们使用此布局和一个RecyclerView嵌套使用 使用 xm ...

  10. alias,data,系统定时开关机的基本操作

    1.修改命令提示符的格式,及每个字母所代表的功能,显示提示符格式输入echo $PS1PS1="[\u@\h \W]\$"\e 或\033启用颜色 \u当前用户 \h主机名简称 \ ...