var
在ES5中,顶层对象的属性和全局变量是等价的,用var
声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是window
对象,在 Node
指的是global
对象
使用var
,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明
var a = 20
var a = 30
console.log(a) // 30
在函数中使用使用var
声明变量时候,该变量是局部的,而如果在函数内不使用var
,该变量是全局的
let
用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效
let不允许在相同作用域中重复声明
//1. 变量不能重复声明
// let star = '罗志祥';
// let star = '小猪';
//这样会报错
当然我们可以在外部定义一个a值,在对象内部定义a值,他不会报错
let a = 20
{
let a = 30
}
let不影响作用域链,依旧可以从函数内部寻找函数外部的值
{
let school = '川农';
function fn(){
console.log(school);
}
fn();
}
const
const
声明一个只读的常量,一旦声明,常量的值就不能改变
这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值
如果之前用var
或let
声明过变量,再用const
声明同样会报错
const内部值可以改变,但是不能改变他的整体
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
这里我适应堆栈再次进行一个解释
假如这里我用const声明一个对象或者数组,是无法修改dui
const TEAM = ['22','川农','信工','计算计'];
现在的TEAM是一个栈,后面的数组是一个堆
这个时候我们可以改变堆的值例如:
// TEAM.push('666');
但是我们不能改变栈的值例如:
TEAM = {} //这样是错误的