es6已经发布很久了,之前只会用var定义变量,学习了let和const后,又学到了一些作用域、JavaScript编译和深拷贝浅拷贝的知识。这章主要来说说这三个定义量的方法:

1.var

  在没学习es6时,会经常用到var,var用来定义一个变量,变量数据类型可以是基础数据类型,也可以是引用数据类型。它可以定义在全局,也可以定义在局部,但最后都会变成全局变量。并且后执行的赋值会覆盖之前的赋值,例:

var name = '小黑'
console.log(name) //小黑
function changeName() {
console.log(name) //undefined
var name = '小白'
console.log(name) //小白
}
changeName()
console.log(name) //小白

  例子还是老例子,功能也没变。为什么会打印出undefined呢?js在执行之前会有一个编译过程,他会先在当前作用域中寻找执行时需要的量,如果有,就不再去外部找了,如果没有,就会跳出当前作用域去父级作用域找。此时编译时找到name,会先给这个变量赋值为undefined,在执行时,先执行的打印语句,所以在没有执行name赋值之前,name就是undefined,这种情况我们称为变量提升。

  在全局下用var定义一个变量name,给它赋值为‘小黑’,然后在局部改变name的值,全局的name也变了。这样就有一个弊端,在不同的作用域下,用同一个变量名,所有的变量都会发生改变,或者说,在不同作用域里,不可以使用相同的变量名,因为它会改变全局的变量,所以es6发布了新的定义变量的方法:

2.let

  let和var作用一致,都是用来定义变量的。区别在于在:

    1.同一作用域下同一个变量只能被let定义一次,而var可以重复定义多次;

let name = '小黑'
let name = '小白'
//报错 var name = '小黑'
var name = '小白'
//name = '小白'

    2.用let定义变量会有暂时性死区,用let定义变量之前引用变量会直接报错,而用var定义变量之前引用变量会引用到undefined;

console.log(name) //报错
let name = '小白' console.log(name) //undefined
var name = '小白'

    暂时性死区是在块级作用域内才会产生的,产生块级作用域的条件有两个:1.有{ };2.在{ }里有let或const定义变量。此时{ }就是一个块级作用域。

    3.在全局用let定义了变量,在局部里定义相同变量名后,全局的变量不会发生改变。

let name = '小黑'
function changeName(){
let name = '小白'
console.log(name) //小白
}
console.log(name) //小黑 var name = '小黑'
function changeName(){
var name = '小白'
console.log(name) //小白
}
console.log(name) //小白

3.const

  const的作用于let类似,它也有暂时性死区,相同的量名也可以定义在不同的作用域,并且在同一作用域下相同的量名只能被const定义一次。const与let的区别为:

    1.const定义的变量必须有初始值;

let name //undefined

const name //报错

    2.const定义的量是通过指针来保存数据的,这个量其实就是指针指向的地址,指针的指向不能变,所以const声明的量不能被改变;

let name = '小黑'
name = '小白'
// '小白' const name = '小黑'
name = '小白'
// 报错

4.块级作用域

  es6在添加let和const的同时,也加了一个作用域:块级作用域i。上文提到,块级作用域是由于在同一作用域有let或const声明的变量而产生的,它的作用是:使变量不再提升。看下面这个例子:

{
var name = '小白'
let name2 = '小黑'
}
name //小白
name2 //报错

  在块级作用域里,var还是会有变量提升,所以这个块级作用域相当于给let和const独自创建的作用域,只针对let和const。

这节就说到这吧,希望小白和小黑能给大家带来快乐~~

var let及const的更多相关文章

  1. var和let/const的区别

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

  2. var let Hositing const Temporal Dead Zone

    var  let  Hositing const Temporal Dead Zone 临时死区

  3. (译文)学习ES6非常棒的特性-深入研究var, let and const

    Var var firstVar; //firstVar被声明,它的默认值是undefined var secondVar = 2; //secondVar被声明,被赋值2 先看一个例子: var i ...

  4. es6 - 一共有 6 种声明变量的方法(var, function, let, const, class, import)

    var命令和function命令声明的全局变量,依旧是顶层对象的属性:let命令.const命令.class命令声明的全局变量,不属于顶层对象的属性.也就是说,从 ES6 开始,全局变量将逐步与顶层对 ...

  5. JavaScript学习系列5 ---ES6中的var, let 和const

    我们都知道JavaScript中的var,在本系列的 JavaScript学习系列2一JavaScript中的变量作用域 中,我们详细阐述了var声明的变量的作用域 文章中提到,JavaScript中 ...

  6. JS中 var,let与const的区别

    1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...

  7. 第一百零六篇:变量的不同声明(var,let和const的不同)

    好家伙,JS基础接着学, 本篇内容为<JS高级程序设计>第三章学习笔记 1.变量 ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据. (确实松散,不像C或C++ ...

  8. [js高手之路] es6系列教程 - var, let, const详解

    function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...

  9. var与let、const的区别

    var与let.const 一.var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100;console.log(a,window.a); // 100 1 ...

随机推荐

  1. 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView

    前言 由于手机屏幕尺寸有限,但是又经常需要在屏幕中显示大量的内容,这就使得必须有部分内容显示,部分内容隐藏.这就需要用一个Android中很重要的概念——滑动.滑动,顾名思义就是view从一个地方移动 ...

  2. python爬虫笔记之re.compile.findall()

    re.compile.findall原理是理解了,但输出不大理解(主要是加了正则表达式的括号分组) 一开始不懂括号的分组及捕捉,看了网上这个例子(如下),然而好像还是说不清楚这个括号的规律(还是说我没 ...

  3. 深入理解Java虚拟机二 阅读笔记

    xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自 ...

  4. python函数知识二 动态参数、函数的注释、名称空间、函数的嵌套、global,nonlocal

    6.函数的动态参数 *args,**kwargs:能接受动态的位置参数和动态的关键字参数 *args -- tuple *kwargs -- dict 动态参数优先级:位置参数 > 动态位置参数 ...

  5. [HDOJ] 2026.Max Sum

    2026.Max Sum (c++) Problem Description Consider the aggregate An= { 1, 2, -, n }. For example, A1={1 ...

  6. C# MATLAB混编(一)

    参照这篇博客进行的C# MATLAB混编学习,学习过程中文章中的一些问题我并没有遇到,但是我遇到了一些新问题,这些问题的解决办法将在下一篇博客给出. 配置环境:vs2010(64位)+Matlab20 ...

  7. 《VR入门系列教程》之7---DK2和Crescent Bay

    The DK2     于2014年春,Oculus发布了第二代开发版头显设备,代号为DK2.与DK1相比,Oculus Rift DK2的外观有很大改进,并且轻了许多,体积仍然比较大,可以罩住大部分 ...

  8. 详解iframe与frame的区别

    iframe与frame的区别 一.使用iframe的优缺点 优点: 1.程序调入静态页面比较方便; 2.页面和程序分离; 缺点: 1.iframe有不好之处:样式/脚本需要额外链入,会增加请求.另外 ...

  9. MyBatis 文档 完整版

    框架技术 1.框架技术 01.是一个应用程序的半成品 02.提供可重用的公共结构 03.按一定规则组织的一组组件 2.分析优势 01.不用再考虑公共问题 02.专心的业务实现上 03.结构统一,易于学 ...

  10. 解决axios接收二进制流文件乱码问题

    1. 须将axios 配置中的responseType设置为'arraybuffer',这样就不会让表格出现乱码现象: 2. 如果要动态设置文件名则需要让后台将名字设置到响应头中,否则将是一个乱码的文 ...