ECMAScript变量是松散类型的,因此变量可以保存任何类型的数据。var在ECMAScript的所有版本中都可以使用,但是const和let只能在ECMAScript6及更晚的版本中使用
一 var关键字
1 var声明提升
使用这个关键字声明的变量,会自动提升到函数作用域的顶部
<script>
function foo(){
console.log(age);
var age = 26;
}
foo()
</script>
//控制台会输出undefined
之所以不会报错,因为ECMAScript运行时把它看成等价的如下代码:
function foo(){
var age;
console.log(age);
age = 26;
}
foo()
2 作用域范围
使用var操作符定义的变量会成为包含它的函数的局部变量,其作用域的范围是函数作用域
function text(){
var message = 'hi';
}
text();
//调用text()函数,它会创建这个变量并给它赋值。调用后变量即被销毁
在函数内定义变量时,省略var操作符,可以创建一个全局变量
虽然可以省略,从而创建全局变量,但不推荐这么做。在局部变量中定义的全局变量很难做到维护,也会造成困扰。因为不能一下子断定省略的var是不是有意而为之。
在严格模式下,如果像这样给未声明的变量赋值,则会抛出ReferenceError
二 let关键字
1 作用域范围
let声明的范围是块作用域,而var声明的作用域是函数作用域
if(true){
var name = 'Matt';
console.log(name);//Matt
}
console.log(name)//Matt
if(true){
let name = 'Matt';
console.log(name);//Matt
}
console.log(name)//EeferenceError:age没有定义
因为let声明变量的作用域仅限于该if块内部,所以不会在块外边再使用
块作用域是函数作用域的子集,因此是用于var的作用域限制也同样适用于let
2 声明冗余报错的问题
var name;
let name;//SyntaxError
let age;
var age;//SyntaxError
这俩个关键字声明的并不是不同类型的变量,他们只是指出变量在相关作用域中如何存在
3 全局声明
重点!重点!重点!
使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)
var name = 'Matt';
console.log(window.name);//Matt
let age = 18;
console.log(window.age);//undefined
三const关键字
1 使用方法
const的行为与let基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量
尝试修改const声明的变量会导致运行时错误
const age = 26;
age = 36;//TypeError:给常量赋值
不能作为迭代变量
整理不易,对您有帮助的,希望可以点赞支持