javaScript的变量声明在ES6之前我们都知道是var a= b; 这简简单单的一句话其实js在内部出了以很多东西。在ES6新增了let const语句之后,有让变量的声明多了方式。这里我们就深入一些javaScript的变量声明;
我们定义一个var a = 1;这一句话其实这里javaScript在后台可以归纳为完成了三步操作;①创建变量a;在内存中开辟一块区域来存放a;这一步我们用的是var 是有声明提升的。关于let 和 const官方文档说的是没有声明提升的。但是我们深入发掘就会觉得很奇怪,我们后面在讲。②变量a的初始化,初始化为undefined,这一步实在声明变量之后紧跟着完成的;③变量a的赋值,这一步我们程序执行到var a =1;这条语句的时候执行的,是词法作用域决定的。这里短短的一句话javaScript就在内部执行了这么多。
上面是声明一个没有的变量的情况,如果是声明一个已有的变量那么,javaScript将不会再内存中在开辟区域,也不会初始化。如果是单纯的声明并没有赋值那么变量其实没有任何变化,如果是生命加赋值那么变量的值将发生变化。
var a =1; console.log(a);//1 var a; console.log(a);//1 var a =2; console.log(a);//2
下来我们说说ES6的let 和 const。let 和 const声明的都是局部变量,const的声明的是常量。let 和 const的出现让javaScript变量的声明更加的严谨和严格。let 和 const对声明的变量十分的挑剔,首先必须在同一个块级作用域中必须是第一次声明,如果之前声明过就会报错,而且声明之后在同一个块级作用域中就不能再次声明,不然也会报错。不同块级作用域中的变量相互是不影响的。这解决了以前for循环输入1-10 但每次都是10的问题。因为每次在for循环的循环体内部都声明了一个let 变量。所以值是不同的。这些知识es入门都有详情解答。
我们这里来看一下let和const和var声明在javaScript内部有什么区别;
其实在ES6很早之前的官方文档其实写的let和const的是存在声明提升的的,但是后来改了。我们看出他们内部一定经过了激烈的讨论我们来看一下代码;
var c=1; { console.log(c) //Uncaught ReferenceError: c is not defined let c = 2; }这种现象官方文档叫做“暂时性死区”。在一个块级作用域内我们必须在使用let创建一个对象之后才能使用。从作用域开始到声明之前这块区域就叫做“暂时性死区”。其实这里c在块级作用域内的let c是声明提升了得,不然我们应该访问到的是外层的c变量。但是虽然创建提升了,但是没有初始化。我们知道在一个var a = 1;之前访问a,返回的是undefined。但是let 和 const 并没有初始化为undefined的这一步,只有执行到let c =2 这一步才初始化c的值。所以在“{"到let c=2这块区域内c是没有任何值得。也就是”暂时性死区“所以我们看到let和const其实是有”声明提升“的。
所以let 和const声明一个变量只用2步:①创建变量(在作用于内提升)②初始化(在执行到声明的地方);
我们在书写javaScript时应该尽量用到let和const 。别看这一点改变,这会让我们代码更健壮,也会避免不必要的错误。