var let及const
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的更多相关文章
- var和let/const的区别
let和const是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var有许多不同,并且let和const也有一些细微的不同,再认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节. ...
- var let Hositing const Temporal Dead Zone
var let Hositing const Temporal Dead Zone 临时死区
- (译文)学习ES6非常棒的特性-深入研究var, let and const
Var var firstVar; //firstVar被声明,它的默认值是undefined var secondVar = 2; //secondVar被声明,被赋值2 先看一个例子: var i ...
- es6 - 一共有 6 种声明变量的方法(var, function, let, const, class, import)
var命令和function命令声明的全局变量,依旧是顶层对象的属性:let命令.const命令.class命令声明的全局变量,不属于顶层对象的属性.也就是说,从 ES6 开始,全局变量将逐步与顶层对 ...
- JavaScript学习系列5 ---ES6中的var, let 和const
我们都知道JavaScript中的var,在本系列的 JavaScript学习系列2一JavaScript中的变量作用域 中,我们详细阐述了var声明的变量的作用域 文章中提到,JavaScript中 ...
- JS中 var,let与const的区别
1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...
- 第一百零六篇:变量的不同声明(var,let和const的不同)
好家伙,JS基础接着学, 本篇内容为<JS高级程序设计>第三章学习笔记 1.变量 ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据. (确实松散,不像C或C++ ...
- [js高手之路] es6系列教程 - var, let, const详解
function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...
- var与let、const的区别
var与let.const 一.var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100;console.log(a,window.a); // 100 1 ...
随机推荐
- Lucene01--倒排索引思想
Lucene01--倒排索引思想 1. 倒排索引的概念: 首先对数据按列拆分存储,然后对文档中的数据分词,对词条进行索引,并记录词条在文档中出现的位置.这样查找时只要找到了词条,就找到了对应的文档.概 ...
- 洛谷P3324 [SDOI2015]星际战争 题解
题目链接: https://www.luogu.org/problemnew/show/P3324 分析: 因为本题的时间点较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT 每个攻击 ...
- Hive之函数与自定义函数
系统自带的函数 1)查看系统自带的函数 hive> show functions; 2)显示自带的函数的用法 hive> desc function upper; 3)详细显示自带的函数的 ...
- apache CXF Service 简单使用
cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...
- 使用.net core基于Razor Pages开发网站一些工作笔记
本文是在实践工作中遇到的一些问题记录,并给出是如何解决的,.net core已经升级到3.0版本了,其实在项目中很早就已经在使用.net core来开发后台接口了,正好有个网站项目,就使用了Razor ...
- vue教程(二)--过滤器和监视改动功能
过滤器filter: 1.将数据进行添油加醋的操作. 2.过滤器分两种: 组件内的过滤器(组件内有效). 全局过滤器 组件内:filters:{过滤器名:过滤器函数fn},fn内通过return 返回 ...
- AQS原理浅析
锁是最常用的同步方法之一,在高并发的环境下激烈的锁竞争会导致程序的性能下降,所以我们自然有必要深入的学习一下锁的相关知识. java的内置锁一直都是备受争议的,在JDK 1.6之前,synchroni ...
- mysql 不同版本下 group by 组内排序的差异
最近发现网上找的 group by 组内排序语句在不同的mysql版本中结果不一样. 建表语句: SET FOREIGN_KEY_CHECKS=0; -- ---------------- ...
- Java编程思想,初学者推荐看看
这是一本介绍Java编程思想,如何从面向过程的编程思想转换为面向对象的编程思想.我个人是比较建议新手看一下的,思想掌握了,学起来自然也就会方便很多的,我还有一些Java基础的数,有需要的可以找我要,都 ...
- JSTL和EL简介
EL Expression Language,表达式语言,通过操作存在于PageContext等的数据,实现JSP的编写更加简单,单纯使用EL不用引入jar包,只要容器支持即可. EL的隐含对象 EL ...