ES6进修笔记一:let、const、块级作用域

一、ES6新增了let敕令

let 和 var 一样都是用来声明标量,但let所声明的变量只在【声明的代码块内】及【声明以后】有用

{
    console.log(a);  // undefined
    console.log(b);  // Uncaught ReferenceError: b is not defined(…)
    var a = 5;
    let b = 10;
}
console.log(a);  // 5
console.log(b);  // Uncaught ReferenceError: b is not defined(…)

let敕令适合在for轮回中运用

// i在for轮回内有用
for(let i = 0;i < 5;i++){
    console.log(i); // 0 1 2 3 4
}
console.log(i);    // Uncaught ReferenceError: i is not defined(…)

//i在全局内有用
for(var i = 0;i < 5;i++){
    console.log(i); // 0 1 2 3 4
}
console.log(i);    // 5

let 敕令临时性死区

// 大括号中的a运用了let声明,所以 a在大括号中临时只能在声明以后有用
var a = 5;
{
    console.log(a); // Uncaught ReferenceError: a is not defined(…)
    typeof a;       // Uncaught ReferenceError: a is not defined(…)
    let a =10;      
    console.log(a); // 10
}
console.log(a);     // 5

let不允许在统一作用域内反复声明变量,因而不能在函数内从新声明变量

{
    let a = 10;
    var a = 15;  //Uncaught SyntaxError: Identifier 'a' has already been declared
}

{
    var a = 10;
    var a = 15;        // 不会报错
    console.log(a);    // 15
}

show(10);  
function show(arg){
    let arg = 5;    //Uncaught SyntaxError: Identifier 'arg' has already been declared(…)
    console.log(arg);
}

hide(10);
function hide(arg){
    {
        let arg = 5;
        console.log(arg);  // 5
    }
    console.log(arg);      // 10
}

二、ES6新增了块级作用域

ES5只要全局作用域和函数作用域,会出现以下的题目

//1、内层变量覆蓋了外层变量
var number = 5;
show();
function show(){
    console.log(number);      // undefined
    var number = 10 ;
}

//2、i泄漏成全局变量
var string = 'hello';
for(var i = 0 ;i<string.length ;i++){
    console.log(string[i]);  // h e l l o
}
console.log(i);              // 5

ES6块级作用域写法(块级作用域能够无穷嵌套,能够替代ES5的匿名函数IIFE)

{
    let number = 5;
    console.log(number);       // 5
    {
        let number = "hello";
        console.log(number);  // hello
    }
}

ES5严厉形式下,函数不能在块级中声明,ES6明确规定能够在块级作用域中声明函数,但声明的函数有点相似let,在块级作用域以外不可援用,因为浏览器能够疏忽以上划定规矩,所以只管防止在块级作用域中声明函数。

//ES5非严厉形式
if(true){
    function show(){    //不报错
    };
}
//ES5严厉形式
'use strict';
if(true){
    function show(){    //直接报错
    };
}

//ES6严厉形式
'use strict';
if(true){
    function show(){    //不报错
    };
}

三、ES6新增了const敕令

const 声明的是一个只读的变量,一旦声明,不可变动,这就意味着一旦声明就必须初始化,不然会报错,const作用域和let作用域一样.

const PI;             //Uncaught SyntaxError: Missing initializer in const declaration
const PI = 3.1415926;
console.log(PI);      // 3.1415926;
PI = 4 ;              // Uncaught TypeError: Assignment to constant variable.

//const声明的变量也和let一样,不能反复声明
var a = 1;
let b = 2;
const a = 5;    //Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 6 ;   //Uncaught SyntaxError: Identifier 'b' has already been declared

//关于复合对象,变量名指向的是数据的地点,const声明的指向的是数据的地点稳定,但数据能够变;若要凝结数据,能够运用freeze.
const A = {};
A.props = 123;
console.log(A.props);  // 123
A = {};                // Uncaught TypeError: Assignment to constant variable.

const B = Object.freeze({});
B.props = 456;         // 通例形式,该行代码无效,严厉形式下会报错
console.log(B.props);  // undefined

全局变量的属性

window.a = 1;
var a = 2 ;
console.log(a);         // 2
console.log(window.a);  // 2

window.b = 1;
let b = 2 ;
console.log(b);         // 2
console.log(window.b);  // 1

总结:

ES5 有两种声明变量的要领:var 和 function敕令
ES6 有六种声明变量的要领:var 、 function 、let 、const 、import、class敕令。
    原文作者:mole
    原文地址: https://segmentfault.com/a/1190000007420499
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞