在javascript中有三种声明变量的方式:var、let、const。javascript
一、varhtml
以前咱们在写js代码的时候都知道能够用var定义全局变量和局部变量,也能够省略var,并且在非严格模式下不会报错,可是实际上在严格模式下,二者的使用有没有区别,可能不少人不清楚。java
var x = 1; y = 2; console.log(x);//1 console.log(y);//2 console.log(window.x);//1 console.log(window.y);/2简单测试下能够知道定义的x和y都被挂载在window对象上,变为window下的属性,这并不能说明什么。
delete x; delete y; console.log(window.x);//1 console.log(window.y);//undefined接下来,看看执行上面代码以后x属性没有被删除,y被删除了,此时区别就体现出来了。首先咱们能够经过Object.getOwnPropertyDescriptor()来获取对象自身某个property的属性信息,这样咱们能够进一步分析:
var c=1; console.log(c);// 1 var c=2; console.log(c); // 2 c=3; console.log(c); // 3var 声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环一样可使用。
for(var i=0;i<=10;i++){ var sum=0; sum+=i; } console.log(sum);声明在for循环内部的sum,跳出for循环同样可使用,不会报错正常弹出结果。
console.log(a);//Uncaught ReferenceError: a is not defined a = 100; console.log(b);//undefined var b = 200;先说第二段代码,var声明的全局变量b在js中会进行代码提高,也就是说var b = 200;会被分解为var b;b=200;代码解析的第时候会将var b;提高到最前面,而且在内存中开辟一个空间,因为b没有被赋值,默认为undefined。第一段代码中当js执行console.log()函数时候因为没有进行var声明,变量没有被提高,不存在内存开辟,因此在console.log()时候直接报错!
二、let
在ECMAScript6标准中,一个重要的概念就是"JavaScript严格模式",须要在最前面加上"use strict";
let注意点:es6
let n = 10; if(true){ let n = 50; } console.log(n);//10表示外层代码块不受内层代码块的影响,若是是用var定义的变量n,那么输出的就是修改后的50。
console.log(a);//Uncaught ReferenceError: a is not defined let a = 100;
不一样var,let不存在变量提高,以上写法会直接报错。函数
3)重复声明问题测试
(function(){ let test1 = "let"; var test2 = "var" let test1 = "let changed";//Uncaught SyntaxError: Identifier 'lTest' has already been declared var test2 = "var changed"; console.log(test1); console.log(test2); })();let在同一个做用域下不容许进行重复变量声明,不然也是直接报错。
三、constui
const用来声明常量,一旦声明,其值就不能够更改,并且必须初始化。若是你非得修改变量的值,js不会报错,只是默默表示失败(不起做用)。spa
const b = 2;//正确 const b;//Uncaught SyntaxError: Missing initializer in const declaration错误,必须初始化 console.log(b);//有输出值 b = 5; console.log(b);//Uncaught TypeError: Assignment to constant variable.没法输出
const的做用域与let相同,只在声明所在的块级做用域内有效,而且也是和let同样不能够重复进行声明。const是常数变量,即通常在require一个模块的时候用或者定义一些全局常量,一旦定义,没法更改,没法重复赋值。.net
参考:code
1. js变量中有var定义和无var定义的区别,es6中let命令和const命令