一、没有块作用域的ES5 var
对于ES5的var,咱们经常用到,不知道大家注意到没有,var 变量声明,没有块作用域。例1:
for(var i=0;i<=5;i++){
console.log("hello");
}
console.log(i); //5
在if或者for循环中声明的变量会泄露成全局变量,var i 是在块中定义的,结果变成了全局变量。再看一个例子:例2。
var temp = new Date();
function f(){
console.log(temp);
if(false){
var temp = "hello";
}
}
f(); //undefined
上面是什么原因导致console.log(temp)的输出结果为:undefined,这个是块内的变量覆盖了块外的变量,导致temp没有定义。
二、var、let、const的区别
- var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问,有变量提升。
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,无变量提升,不可以重复声明。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,无变量提升,不可以重复声明。注意:const常量,指的是常量对应的内存地址不得改变,而不是对应的值不得改变,所有把应用类型的数据设置为常量,其内部的值是可以改变的,例如:const a={}; a.b=13;//不会报错 const arr=[]; arr.push(123);//不会报错
-
let 声明的变量只在块级作用域内有效
'use strict';
function func(args){
if(true){
let i = 6;
console.log('inside: ' + i); //不报错
}
console.log('outside: ' + i); // 报错 "i is not defined"
};
func();