ES6学习笔记--var,let,const详解

前言:

letconst是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var有许多不同,并且letconst也有些细微的不同,在认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节,重新整理了一下,分享给各位.

var特性

1.全局变量 

var a=[ ]
for(var i=0;i<10;i++){
  a[i]=function(){ 
  console.log(i)}
}//10 10 10 10 10
console.log(i) //10
var变量在for中的声明在外头可以访问到复制代码

2.函数作用域

function world() {
    var abc = 'hello'
    console.log(abc)
}
world() // hello
console.log(abc) // ReferenceError: abc is not defined  在函数外面访问不到复制代码

3.变量提升:

提升到作用域顶部

例子1.a=10  //undefinedvar a

例子2.var a = 10;
function f1(){
    console.log(a); //undefined
    var a = 20;  //var a 提升到该作用域顶部     
    console.log(a); // 20
}
f1()复制代码

4.可重复声明 

 var x=1 var x=2复制代码

let特性

1.块作用域

{let a=0}
console.log(a) //ReferenceError: a is not defined复制代码

每个let绑定自身所在的块作用域,且只能在块作用域中访问到

2.不可被重新声明

let abc = 'hello'
let abc = 'world' // SyntaxError: redeclaration of let abc复制代码

区别于var

3.暂时性死区 

在声明之前使用会报错

console.log(a) //ReferenceError: a is not defined
var a=0 //在声明之前的语句为暂时性死区复制代码

4.导致typeof不安全

//正常情况 一个变量没有声明前使用typeof 结果为undefined
typeof b ; //undefined
//在暂时性死区内使用typeof,会报错
typeof c//报错let c复制代码

const特性

1.不可修改

const a=1;
a=2;//报错复制代码

并非真正意义上的不可修改,而是const指向的内存地址不可改变,并不是const的值不可改变

const a={}a.name='xxx'a.age='21' //可以运行const b=[]b.push('xxx')//可以运行复制代码
取消这一特性,可以通过const c=Obeject.freeze({})来实现

2.块作用域,暂时性死区

这点与let相同

3.声明时必须赋值

const a //报错复制代码
const声明时必须赋值,否则报错

函数提升

函数的提升只对声明式函数有效,对字面量函数无效
console.log(f1()) // 10; function f1(){ return 10; }   //函数提升console.log(f1()) // 10;

//与下面代码作用相同

var f1=function(){return 10;}
console.log(f1()) // 
console.log(f1()) // 
复制代码
函数提升的优先级要高于变量提升,也就是函数会被优先放在顶部,而后才是变量
console.log(a); //function (){return}
var a = 100;
function a(){
    return 10;
}
console.log(a); // 100;复制代码

为什么需要块作用域

1. 内层变量可能会覆盖外层变量
2. 计数循环的变量泄露成全局变量


全部评论

相关推荐

10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务