首先我们比较一下使用var声明的变量和不使用var声明的变量的区别:
- 使用var声明的变量声明前调用,那么该变量的值为undefined;不使用var声明的变量声明前调用直接报错Uncaught ReferenceError:xxx is not difined;
- 使用var声明的变量不可delete,不使用var声明则可以delete掉释放空间。(实则浏览器的垃圾回收机制也会清理掉用var声明但是不再使用的的变量,比如某个仅执行一次的函数中被调用的某个var 声明的变量)
- 未使用var声明的变量实际上是window的一个对象,而使用var声明的变量只是一个本地变量而已。
- 在使用'use strict'的模式之下,不使用var 声明变量的语法是不被允许的,报错:Uncaugth SyntaxError;
- console.log(a); //undefined,这里还涉及<span style="color:#ff0000;">变量提升</span>的概念
- console.log(b); //报错 Uncaught ReferenceError: b is not defined
- var a = 1;
- b = 2;
- console.log(a); //1
- console.log(b); //2
- console.log(window.a); //undefined
- console.log(window.b); //2
- delete a;
- delete b;
- console.log(a); //1
- console.log(b); //报错 Uncaught ReferenceError: b is not defined,可见b在声明前使用和声明后delete再使用是一样的结果
- 看意思就知道,const是常量的意思,就是说只能被定义一次,且不可再改变,否则就会报错:Uncaught TypeError: Assignment to constant variable.另外声明前使用也会报错:Uncaught ReferenceError: a is not defined;看一个例子:
- const foo = {};
- foo.prop = 123;
- console.log(foo.prop); //123
- foo.prop = 456;
- console.log(foo.prop); //456
- const foo = {}; //Identifier 'foo' has already been declared
- const group = [];
- group.push('Bob');
- console.log(group[0]); //Bob
- group = ["Tom"];//Uncaught TypeError: Assignment to constant variable.
- var 和 let 就有意思了,let声明的变量声明前使用也会报错,这个与const一致;最重要的一点是let声明了一个块级作用域的变量在一个块的“}”结束的时候,该变量消失。例子:
- (function(x,y){
- var b = x;
- let c = y;
- if (true) {
- var b = 5;
- let c = 6;
- console.log(b); //5
- console.log(c); //6,这里的let c在下一行的"}"之后消失
- }
- console.log(b); //5
- console.log(c); //3 ,这里仍然是第三行的let c;
- }(2,3));
- 再看一个例子:
- var array1 = [],array2 = [];
- for(var i=0;i<10;i++){
- array1[i] = function(){
- console.log(i);
- };
- }
- for(let j=0;j<10;j++){
- array2[j] = function(){
- console.log(j);
- };
- }
- array1[6](); //10
- array2[6](); //6
- 再看一个例子:
- var tmp = 1;
- if(true){
- tmp = 2; //ReferenceError
- let tmp;
- }
- 还有一点要注意,var声明的变量为全局变量,而let,const声明的变量不为全局变量,使用window访问不到,如下:
- var a = 1;
- console.log(window.a); //1
- let b = 2;
- console.log(window.b) //undefined