前言:ES6新推出的语法具有自己的特性,我们在实际开发时,一个项目中不可能指定使用用ES几,而是根据实际情况,所有的配合使用。
例如:
if(true){ var c=88; let d=99; } console.log(c);//88 console.log(d);//报错
这里为什么var就可以,而let定义的变量就不可以呢?
这是因为:var的作用域就是全局作用域和函数作用域,执行环境也就是只有全局执行环境和函数作用域。
let定义的变量的作用域是:全局作用域、函数作用域、块级作用域({}包围的作用域如:if、for包围的)。对应的执行环境也应该包括(全局执行环境、函数执行环境、块级执行环境。)。
【1】块级执行环境,代码执行到{}包围代码的时候,创建一个块级的执行环境,这个执行环境在创建的同时也被执行(边创建边执行):
1.作用域链。当前的活动变量为作用域的最前端。
2.this和外部的函数的执行环境或者全局执行的this一致。
3.活动变量,存储着let或者const定义的变量,以及for中定义的i等(不存在变量提升)
当块级执行环境中的代码执行完成之后,该执行环境被销毁,同时变量对象以及属性均被销毁,外部访问不到其变量了。
【2】函数、全局执行环境
对于函数和全局环境来说,let、const定义的变量不能成为函数或全局执行环境变量对象的属性。可以说let和const定义的变量不在执行环境创建时被添加到变量对象(VO)中,而是在执行阶段将其以另一种形式添加到活动对象(AO)中,而且不是AO的属性,以另外一种形式存在。
总结:当执行全局代码或者调用函数的时候都会分别创建自己的一个执行环境,执行代码期间,遇到{}比如if或者for的时候,(1)如果里面有let或者const,则会给创建一个块级的执行环境(这个块级执行环境会有一个变量对象,但是这个变量对象是活动对象即一行行执行,不存在变量提升等。还有一个作用域链。);(2)如果里面没有let或者const则不会创建块级的执行环境(即执行环境只有全局和函数)。在执行全局或者函数代码期间,如果遇到let或者const,将其添加到活动对象(AO)中,只不过不是和var定义的一样是AO的属性,而是以另一种形式存在
(一)块作用域构造let和const
let声明(声明变量)
1.块级作用域(即let声明的变量除了全局作用域、函数作用域还有块级作用域):
let和var的用法一致,都是用来声明变量,只不过let声明的变量不会被提升,可以把变量的作用域限制在当前代码块中。也就是{}中。
例如:
2. 使用let声明的变量名不可以和同一作用域下的任何变量重名
例如:var index=0;
var index=10;
let index=100//报错:因为在这个作用域中,已经有了变量名为index的变量。
注意:但是不同的作用域中可以是重复。例如:
var index=0
{let index=10}
const声明常量
const用于声明常量,其特点如下:
1. 每个通过const关键字声明的常量必须在声明的同时进行初始化;
例如:const x=10; //正确
const x;
x=10 //报错
2.与let类似,在同一作用域下用const声明已经存在的标识符也会导致语法错误,无论该标识符是使用var 还是let声明的。
3.如果const声明的是对象,对象本身的绑定不能修改,但是对象的属性和属性值是可以修改的。例如:
let和const的全局块作用域绑定:
我们知道,在全局作用域中使用var声明的变量或对象,将作为浏览器环境中的window对象的属性,这意味着使用var很可能会无意中覆盖一个已经存在的全局属性。例如:
getting被定义为一个全局变量,并立即称为window对象的属性。定义的全局变量Screen,则覆盖了window对象中原有的Screen属性。
如果在全局作用域下使用let或者const,则会在全局作用域下创建一个新的绑定,但该绑定不会成为window对象的属性。代码如下:
上述的Screen是内建的属性,而不是通过var定义的。如果通过var 定义 ,因为在同一作用域下let或者const不能使用重名即不能使用已有的变量名。
(二)模板字面量
ES 引入了模板字面量,对于字符串的操作进行了增强方式。
- 多行字符串(真正的多行字符串)
- 字符串占位符 (可以将变量或JavaScript表达式嵌入占位符中并将其作为字符串的一部分输出到结果中)
2.1多行字符串
模板字面量的基础语法就是用反引号(`)来替换字符串的单、双引号。例如:
let message=`Hello World`;
这句代码使用模板字面量创建了一个字符串,并赋值给message变量,这时变量的值与一个普通的字符串并无差异
如果想要在字符串中使用反引号,那么同样使用反斜杠(\)将它转义即可。如下所示:
var message=`Hello \`world`;
注:在模板字面量中,不需要转义单、双引号。
在ES5中,如果一个字符串量要分为多行书写,那么可以采用两种方式来实现:即\和+来拼接字符串(/表示承接下一行的代码),例如: @H_502_219@
var message="Hello \ World!"
var g="welcom"+ "you"
但是将二者打印在控制台,仍然显示在一行,没有换行。
如果要真正换行,则需要手动加入换行符:
var message=“Hello\n\
Wordl”
var g="Welcom"
+ "\n"
+"you"
在ES6中,使用模板字面量语法,可以很方便地实现多行字符串的创建。如果需要在字符串中添加新的一行,只需要在代码中直接换行即可。代码如下所示: @H_502_219@
var message=`hello wolrd !`; console.log(message)
注意:在反引号中的所有空白字符(包括但不限于空格、换行符、制表符)都属于字符串的一部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。