一,作用域
全局作用域 函数作用域 块级作用域;
var 定义的变量只有全局和函数作用域(ES5)没有块的概念,可以跨块访问,不能跨函数访问,在块级作用域内定义仍然是全局变量;
let 定义的变量只能在块作用域里访问,不能跨函数访问;
const 用来定义常量,使用时必须初始化,只能在块作用域里面访问;
块级作用域:{}里面的都是如if(){},for(){},while(){} ,(function (){})()立即执行函数也是块级作用域;
用var 声明变量i和在里面用let声明变量j,在块作用域里面都可以访问的到;但是53行跳出二级for循环的块级作用域就报错;但是var声明的变量可以在全局访问到,因为长度问题,各位i可以在for循环55行外面打印i;可以打印出来
二,变量声明
let var可以仅声明不赋值,const必须声明的时候就赋值;
声明变量都应打印到;
但是给用var 和let声明变量不赋值打印的是undefined,而const声明不赋值直接报错
三,变量值是否可以修改
let var声明变量的值可以修改 const声明的变量如果是基本数据类型则不可修改,如果是引用类型则可以修改值,不可以修改地址
上面的例子中const 定义基本数据类型Number 修改其值后报错,接着我们看下面的例子:
在上面的例子中修改person对象的name属性并没有报错,而且修改成功
因为对象是引用类型的数据(地址保存在堆中,值保存在栈中),person中保存的仅是对象的指针,const仅能够保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许的。
我们来试着修改一下指针,让person指向一个新的对象,就会报错:
四,是否可以在相同的作用域内重复声明
var 可以在同一作用域内重复声明,let const 不能在同一作用域内重复声明
五。let 相较于var 的优势
优势体现在选项卡功能,应用多个按钮切换,for循环若换成var 则i 是全局变量循环结果为按钮的数量就无法实现