ES5、ES6自学笔记( 八 )

var message
声明名为的变量,可以用于保存任何类型的值(不初始化的情况下,变量会保存一个特殊的值)
var message="hi";message=100;//合法但不推荐
虽然不推荐改变保存变量保存值的类型,但这在中是完全有效的 。
var作用域
var操作符定义的变量会成为包含它的函数的局部变量
function test() {var message="hi";}console.log(message);//出错
这里变量是函数内部使用var定义,意味该变量将在函数退出时被销毁,所以打印会报错
var声明提升
使用var时下面的代码不会报错 。因为使用var声明的变量会自动提升到函数作用域顶部:
function foo () {console.log(age);var age=20;}foo();//类似于function foo () {var age;console.log(age);var age=20;}foo();//undefined
这就是所谓的"提升",也就是把所有的变量声明拉到函数作用域的顶部 。此外,反复使用多次var也没问题 。
function foo() {var age = 16;var age = 26;var age = 36;}
let
let 跟 var作用差不多,但有着非常重要的区别 。最明显的区别是
let:声明范围是块
// let是块级作用域,并且变量不会得到提升if (true) {var a = 10;}console.log(a); // 10if(true){let b = 20;}console.log(b); // 报错
在这里,age变量之所以不能在if块外部被引用,是因为它的作用域仅限于该块内部 。
1)块作用域是函数作用域的子集,因此适用于var的作用域限制同样也适用于let
2)let也不允许同一块作用域中出现冗余声明,会导致报错
var name;var name;// 不会报错let age;let age;//SyntaxError:标识符age已经声明过
暂时性死区
let 与 var的另一个重要的区别就是let声明的变量不会在作用域中被提升
//name会被提升console.log(name);//undefinedvar name ="Matt";//age不会被提升console.log(age);//ReferenceError: age 没有定义let age=26;
在解析代码时,引擎也会注意出现在块后面的let声明,只不过在此之前不能以任何方式来引用未声明的变量 。在let声明之前的执行瞬间被称为"暂时性死区",在此阶段引用任何后面才声明的变量都会抛出 。
var num = 10if (true) {console.log(num);// 报错,因为此块状区域类有使用let来声明了num,所以这里的num就不会往外面找,只会在此区域找,又因为let在console.log后面,所以产生错误let num = 20;}
全局声明
与var关键字不同,使用let在全局作用域中声明的变量不会成为对象的属性(var 声明的变量则会)
var name ="xiao";cosole.log(window.name);//"xiao"let age= 20;console.log(window.age);//undefined
不过,let声明仍然是在全局作用域中发生的,相应变量会在页面的生命周期内存续 。因此,为了避免,必须确保页面不会重复声明同一个变量 。
条件说明
在使用var声明变量时,由于声明会被提升,引擎会自动将多余的声明在作用域顶部合并为一个声明 。因为let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量,同时也就不可能在没有声明的情况下声明它 。
>var name= "Continue"let age=20>//假设脚本不确定页面中是否已经声明了同名名量//那它可以假设还没有声明过var name ="Continue"//这里没问题,因为可以被作为一个提升声明来处理//不需要检查之前是否声明过同名变量let age=20;//如果age之前声明过,这里会报错