赞
踩
ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的语法规范
ES6实际上是一个泛指,泛指ES2015及后续的版本
ES6中新增的用于声明变量的关键字
- if(true) {
- let a = 10;
- }
- console.log(a); //a is not defined
注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性
- <script type="text/javascript">
- /*
- let关键字就是用来声明变量的
- 使用let关键字声明的变量具有块级作用域
- 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
- */
-
- /* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
- if (true) {
- var a = 10;
- let b = 20;
- }
- console.log(a);
- console.log(b);
-
-
-
-
- </script>
在我们for循环的时候,如果使用var来声明变量,即使已经循环完了,在for循环的外面还是能访问得到这个计数的变量,如果使用了let(即使let是在for的括号里而不是在{}里,它依然和for的块级作用域绑定),就不能在for循环的外面使用该变量
- <script type="text/javascript">
- /*
- let关键字就是用来声明变量的
- 使用let关键字声明的变量具有块级作用域
- 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
- 防止循环变量变成全局变量
- */
-
- /* -------防止循环变量变成全局变量--------- */
- for (var i = 0; i < 2; i++) {
-
- }
- console.log(i);
-
- for (let j = 0; j < 2; j++) {
-
- }
- console.log(j);
-
- </script>
- console.log(a); //a is not defined
- let a = 20;
变量必须先声明再使用
- var temp = 123;
- if(true) {
- temp = 'abc';
- let temp;
- }
在块级作用域中声明的变量就和这个块级作用域进行了绑定 ,不会受外部影响,所以if里面的temp和外面声明的temp毫无关系,在if语句里面先使用temp变量再声明会报错
一旦在块级作用域中声明一个变量,这个变量就会和这个作用域进行绑定,具有暂时性死区
- var arr = [];
- for(var i = 0; i < 2; i++) {
- arr[i] = function() {
- console.log(i);
- }
- }
- arr[0](); //2
- arr[1](); //2
当i=0、1时进行循环,将两个函数赋值给数组的第0、1个值,注意,此时的函数没有调用,在整个for循环执行完成,也就是i=2不符合条件的时候,就会去调用两个函数,在函数的当前作用域中,是不存在i变量的,根据作用域链,会继续向上查找,于是去到全局作用域查找,i就是for循环中的计数器i,当前i=2,所以两个输出的都是2
注意:此题的关键点在于变量i是全局的,函数执行时输出的都是全局作用域下的i值
- let arr = [];
- for(let i = 0; i < 2; i++) {
- arr[i] = function() {
- console.log(i);
- }
- }
- arr[0](); //0
- arr[1](); //1
let关键字有块级作用域, 两次循环都会产生块级作用域,里面各有一个i的值,这两个i值相互不影响,因为是不同的作用域,执行函数的时候,在当前块级作用域中没有i,根据作用域链,要继续向上查找,找到的是自己的上一级也就是循环产生的作用域里的i值
作用:声明常量,常量就是值(内存地址)不能变化的量
使用const声明的常量具有以下特点:
- if(true) {
- const a = 10;
- }
- console.log(a); //a is not defined
- <script type="text/javascript">
- if (true) {
- const a = 10;
- if (true) {
- const a = 100;
- console.log(a);
- }
- console.log(a);
- }
- console.log(a);
- </script>
const PI; //Missing initializer in const declaration
对于基本数据类型来讲,一旦赋值,值不可更改,比如数值、字符串类型的值
对于复杂数据类型来讲,不能重新赋值,但是可以更改数据结构内部的值,比如数组、对象
- const PI = 3.14;
- PI = 100; //Assignment to constant variable.
- const ary = [100,200];
- ary[0] = 'a';
- ary[1] = 'b';
- console.log(ary); //['a','b'];
- ary = ['a','b']; // Assignment to constant variable.
- const ary = [100, 200];
- ary[0] = 'a';
- console.log(ary);
- ary = [1, 2];
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
什么时候使用const?定义了之后一般不改变的值,比如函数值,PI值,或者数学公式中不变的值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。