JS——JavaScript中const、var、不带var和let区别

序言

  开发中经常遇到变量的定义,平时就是一股脑的var或者全局的时候就不写var,所以为了清醒认识他们之间的区别,此处做个记录。

正文

1、var

带var定义的变量只有函数内作用域和全局作用域,作为全局变量时挂载在window对象上,configurable为falsevar定义的变量可以修改,如果不初始化会输出undefined,不会报错。

var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){
a = 4;
console.log('函数内var定义a:' + a);//可以输出a=4
} 
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4
delete a; //return true,删除失败,因为configurable为false

2 不带var

不带var定义的变量,全局作用域,挂载在window对象上,configurable为true

x=3;  //挂载于window.x

//匿名箭头函数,自执行函数
(()=>{
  x=5;   //x被改变
  console.log(x)
})()   //输出5
console.log(x); //输出5
Object.getOwnPropertyDescriptor(window,'x') 
//{value: 5, writable: true, enumerable: true, configurable: true}
delete x; //return true,删除成功,因为configurable为true

3 let

let定义的变量具有块级作用域,不能重复定义,configurable为false,函数内部使用let定义后,对函数外部无影响。

let x;    //正确,可以不用初始化.x为undefined 
let x=5;  //报错,不能重复定义
let i=3;   //全局作用域
{ 
  let i=4;  //作用域为花括号内
  console.log(i);  //输出4
}

//匿名箭头函数,定义后运行
(()=>{
  let i=5;   //局部变量
  console.log(i)
})()   //输出5
console.log(i)  //输出3
delete i;  //return false

4 const

const拥有let所有性质,但const不能被直接修改,必须被初始化,configurable为false

const i=1;
i=5;  //报错,const定义的不能直接修改    
const p={
  name:"Minions",
  age:8
}  //定义字面量对象p
p={
  name:"xx"
} //报错,不能直接修改p
p.age=16; //正确修改
delete p;  //return false

有趣的面试例子

面试的时候很经常遇到一个例子:

for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}
//这个例子执行完输出什么结果?

//答案是 5,5,5,5,5

//如果想要输出0,1,2,3,4改怎么实现?
//其中一种方案就是把var换成let就可以了。let的块级作用域在这里就体现出来了。

for (let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}

——(完)——

原文地址:https://www.cnblogs.com/kitor/p/13514301.html