美文网首页
深入理解ES6一

深入理解ES6一

作者: 前端小兵 | 来源:发表于2017-09-18 22:31 被阅读17次

    let声明

    1. Es6中引入块级声明,let声明的变量作用域限制在代码块中;
    2. let声明不会被提升;
    3. 在同一作用域中不能用let重复定义已经存在的标识符,会抛出错误。

    const声明

    1. const声明的变量作用域也会限制在代码块中;
    2. const声明的是常量,其值一旦被设定后不可更改,每个通过const声明的常量必须进行初始化(赋值)
    3. const声明不允许修改绑定,但允许修改值;例如const声明对象,对象的值是可以修改的

    临时死区的存在

    • 临时死区(temporal dead zone)TDZ用来描述letconst的不提升效果;
    • var声明不同,letconst声明的变量不会被提升到作用域的顶部,在javascript引擎扫描代码的时候会将letconst的声明放到临时死区中

    循环中的块级作用域

    • 常见的循环错误;var声明是全局变量
    var funcs = [];
    for(var i=0;i<10;i++) {
        funcs.push(function() {
            console.log(i);
        })
    }
    funcs.forEach(funcion(func) {
        func(); //输出10次10 
    })
    
    • 使用闭包解决这个问题
    var funcs = [];
    for(var i=0;i<10;i++) {
        funcs.push((function(value){
            // 变量i的值在传递到这个作用域是被赋值给了value;
            // 此时这个值就不会随外部变量而变化了;
            return function() {
                console.log(value);
            }
        })(i));
    }
    funcs.forEach(function(func) {
        func(); //输出0,然后是1,2直到9
    })
    
    • 使用let声明简化
    var funcs=[];
    for(let i=0;i<10;i++) {
        funcs.push(function() {
            console.log(i);
        })
    }
    funcs.forEach(function(func) {
        func(); //输出0,然后是1,2直到9
    })
    

    全局作用域的绑定

    • var被用于全局作用域时,它会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)的属性
    • 当在全局作用域中使用letconst,会在全局作用域下创建一个新的绑定,但是该绑定不会添加为全局对象的属性。

    相关文章

      网友评论

          本文标题:深入理解ES6一

          本文链接:https://www.haomeiwen.com/subject/lidisxtx.html