在ES5之前,js中只有两种类型的作用域:全局作用域和函数作用域。ES6中新增了块级作用域。
全局作用域
全局声明(不在函数内)的变量拥有全局作用域,全局变量可以在js代码的任何位置访问。
var count = 1;
function add(){
console.log(count);
}
add() // 1
let、var在函数外部声明的变量都是全局作用域。
函数作用域
函数内声明的变量拥有函数作用域,只能在函数内访问。
var count = 1;
function add(){
console.log(count);
var flag = 1;
}
add(); //1
console.log(flag); //flag is not defined
块级作用域
在{ }内通过var声明的变量没有块级作用域,用let声明有块级作用域。
{
var count = 1;
let flag = 1;
}
console.log(count);//1
console.log(flag);//flag is not defined
如果let和var在全局函数外或者块外声明都拥有全局变量。
变量的重新声明
用var声明的变量允许在程序的任何位置进行重新声明
var count = 1
{
//此处count为1
console.log(count);//1
var count = 2;
}
//此处count为2
console.log(count);//2
var count = 3
console.log(count);//3
所以使用var声明的变量重新声明变量时会产生问题。
使用let可以解决这一问题。在相同的作用域中,使用let声明的变量是不允许重新声明的。
let count = 1;
let count = 2;//不允许重新声明,因为不在同一作用域内
{
let count = 2;//允许重新声明,因为不在同一作用域内
let count = 3;//不允许重新声明
//此处count为2
console.log(count);
}
//此处count为1
console.log(count);//1
总结:
var不管作用域相同不相同,都可以重新声明变量
let只在作用域不相同时才可以重新声明变量
const
const是常量的意思,与let作用域的用法是一致的,但不能重新赋值。
在声明时赋值
//报错:Missing initializer in const declaration
const PI;
PI = 3.1415926;
//正确
const PI = 3.1415926;
不可更改常量变量,但常量对象的元素和常量数组的元素是可以改变的,但不可重新赋值。
const obj = {name:'小白小白不吃白菜',age:18};
obj.age = 20;
console.log(obj);//{name: "小白小白不吃白菜", age: 20}
obj = {name:'小白小白真相大白',age:30} //报错:Assignment to constant variabl