let命令基本用法ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量只能在let代码块中有效。例如:{var a = 1;let b = 2;}console.log(a); //1console.log(b); //Error: a is not de ...
let命令
基本用法
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量只能在let代码块中有效。
例如:
{var a = 1;let b = 2;}console.log(a); //1console.log(b); //Error: a is not defined
不存在变量的提升
let不会像var那样存在变量的提升
var a = [];for(var i = 0;i<10;i++){ var b = i; //ES5的写法 a[i] = function() { console.log(b); }}a[3](); //9 (这里因为使用了var使得变量提升,循环体满足条件才会跳出循环,所以最后输出结果也是9)
var a = [];for(var i = 0;i<10;i++){ let b = i; //ES6的写法 a[i] = function() { console.log(b); }}a[3](); //3 (这里为什么会是3呢,因为let只对循环体的内部起作用,它内部的b是影响不到外部的,所以最后输出的是3)
暂时性死区
只要块级作用域中存在let命令,它所声明的变量就绑定(binding)在这个区域中,不在受外部的影响。
var a = 10;{ console.log(a); //undefined (作用域内部变量不受外部影响,还有就是let不存在变量提升,所以才会报未定义) let a = 3; console.log(a); //3}
不允许有重复声明
let不允许在同一个作用域内,重复声明同一个变量
{ var a = 2; let a = 2; console.log(a) // Error: Identifier 'a' has already been declared}
块级作用域
为什么需要块级作用域?
ES5只用全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景
第一种场景,内层变量可能会覆盖外层变量
var time = new Date();function fun() {console.log(time); if(false) { var time = 'hello world!'; //这里的time会优先提前,就会覆盖前面的全局变量 }}fun(); //undefined
第二种场景,用来计数的循环变量泄漏为全局变量
var t= "Hello world!";for(var i=0; i < string.length;i++){ console.log(t[i]);}console.log('循环结束'); //循环结束console.log(i); //12 (按理说这里循环体已经结束应该释放i中的内存占用,但是变量i中的内存没有释放,如果后面我们还要用到变量i的话就会影响i的值,所以这是很不合理的)
const 命令
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const a = 1;console.log(a); //1a = 2;console.log(a); // TypeError: Assignment to constant variable
const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值,不然就会报错。
const n;console.log(n); //SyntaxError: Missing initializer in const declaration
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效;声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用;不允许重复声明。
未完,持续更新中……
原标题:ES6学习笔记
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。