zoukankan      html  css  js  c++  java
  • let const

    es 6

    Block Bindings(块绑定) let 声明

                块声明(块级作用域)的两种形式 
                    1 在一个函数内; 
                    2 在一个大括号({})内
                块声明与var声明不同
                    1 var声明有变量声明提升的过程 块声明不存在变量声明提升
                    2 var 声明的变量可以再次声明 块声明不可以 报错
            
                例子1
                    if(condition){
                        var a = 12;
                    }
                    无论condition的值被解析为true 还是false 在循环体之外都可以可以访问到a这个变量
                    原因 js有一个预编译过程 也就是变量声明提升的过程 js会在执行代码之前把var声明的变量提升到当前作用域的顶端可以理解为
                    var a;  //默认赋值为undefined
                    if(condition){
                        a = 12;
                    }
                    if(condition){  
                        console.log(a) //报错
                        let a = 12;
                    }
                    let声明的变量 没有变量声明提升这个过程
                    也就是说 在声明let a = 12之前 不能访问到a 报错
                    
    
                例子2
                    if(condition){  
                        var count = 30;
    
                        // Syntax error
                        let count = 40;
                    }
                    如果一个变量已经声明了 在let声明的范围之内再次声明会导致错误发生
                
                例子3
                    var count = 30;
    
                    if (condition) {
    
                        let count = 40;
                    }
                    这种结构的不会导致错误发生 几个问题
                    1 在let声明之前不能访问到 count 暂时性死区
                    2 在let声明之后 设置 count = 41; 不影响外围的count 相当于不同的同名变量
                    3 进入if语句中 因为定义了一个新的count变量 此count 非全局count
            

    总结let

    1. let 定义的变量只存在当前作用域的函数代码块中
    2. 暂时性死区 在let声明之前不能访问到此变量 会发生错误
    3. let声明不能重新定义 会发生错误
    4. let 声明的全局对象 不挂载到window上 let a = 12; window.a = 2; window.a !== a

    常量声明 const

                const obj = {
                    name: "lxk"
                }
                obj.age = 21; 
                //不会报错 因为obj是一个指针 现在指针没有变 变得是指针指向的值 发生了改变
                obj = {
                    name: "lxk"
                }
                //报错 指针现在指向了一个新的内存区
            
    1. 同let声明一样 都存在块级作用域 不能重复声明 暂时性死区
    2. 赋值之后不可以修改 此常量的值
    3. 常量声明时 必须赋值
    4. for 循环中 创建了多个i的副本 好找到当前的i

    let const 暂时性死区
    例:
    typeof name; ==>报错 暂时性死区
    let name = ‘js’;
    对比
    typeof age; ‘undefined’ 访问了未定义的变量
    const 声明一个常量
    const MAX_LENTH ==> 语法错误
    声明一个常量必须要赋值
    const 声明的常量值 不可以再改变
    如果是一个对象的话 可以修改属性
    如果是一个数组的话 可以添加 删除项
    理解为
    Const 声明一个常量
    基本类型  值不可改变
    复杂类型 指针不可以改变
    var 和 const let区别
    var name = 12;
    ‘name’ in window ==> true
    let age = 12; // const 同理
    ‘age’ in window ==> false 
    重点推荐: 默认使用const 只有确实需要改变变量的值的时候使用let
  • 相关阅读:
    [转]Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)
    [转]OAuth 2.0
    SpringMVC之七:SpringMVC中使用Interceptor拦截器
    多数据源问题--Spring+Ibatis 访问多个数据源(非分布式事务)
    读写分离
    SVN中检出(check out) 和 导出(export) 的区别
    Hbase之三:Hbase Shell使用入门
    hadoop之一:概念和整体架构
    Twitter Storm如何保证消息不丢失
    Twitter Storm: storm的一些常见模式
  • 原文地址:https://www.cnblogs.com/liuxiankun/p/8399066.html
Copyright © 2011-2022 走看看