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. MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!

    有一些小伙伴觉得 MyBatis 只有方法中存在多个参数的时候,才需要添加 @Param 注解,其实这个理解是不准确的.即使 MyBatis 方法只有一个参数,也可能会用到 @Param 注解. 但是 ...

  2. C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

    连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符方法的 LINQ to Objects 实现主要通过两种方法之一执行:立即执行和延迟执行.使用延迟执行的查询运算符可以进一步分为两种 ...

  3. [leetcode] 55. Jump Game (Medium)

    原题 题目意思即 每一格代表你当前最多能再往后跳几次,从第一格开始,如果能跳到最后一格返回true,反之为false. 思路:用一个下标记录当前最多能跳到哪一格,遍历一遍 --> 如果当前格子不 ...

  4. Java集合Collention

    集合:又被称为容器,用来存储数据,他是一个对象,能够将具有相同性质的多个元素汇聚成一个整体,集合被用于存储,获取,操纵和传输聚合的数据. 这种数据结构称为集合 Collenction:他是集合的根接口 ...

  5. java连接oracle数据库jdbc

    driver = oracle.jdbc.driver.OracleDriver url = jdbc:oracle:thin:@localhost:1521:orcl

  6. Shell基本语法---shell介绍

    简介 1. shell是在linux系统上高效运行的脚本语言 2. 主要用来开发一些实用的.自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件 3. shell的基本命令也是linux操作系统 ...

  7. 隐马尔科夫模型HMM介绍

    马尔科夫链是描述状态转换的随机过程,该过程具备“无记忆”的性质:即当前时刻$t$的状态$s_t$的概率分布只由前一时刻$t-1$的状态$s_{t-1}$决定,与时间序列中$t-1$时刻之前的状态无关. ...

  8. Java代码计算运行时间

    突然想准确的测试一下Java代码的执行时间,在网上找了一会.发现基本有以下两种方法:第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentT ...

  9. web渗透---第二天

    协议常识 HTTP协议 百度百科的解释:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 所有的WWW文件都必须遵守这个标准. ...

  10. 3. 源码分析---SOFARPC客户端服务调用

    我们首先看看BoltClientProxyInvoker的关系图 所以当我们用BoltClientProxyInvoker#invoke的时候实际上是调用了父类的invoke方法 ClientProx ...