zoukankan      html  css  js  c++  java
  • ES6中的块级作用域与函数声明

      块级作用域
          
        定义:是一个语句,将多个操作封装在一起,通常是放在一个大括号里,没有返回值。
        为何需要块级作用域?
         
        在ES6之前,函数只能在全局作用域和函数作用域中声明,不能在块级作用域中声明。没有块级作用域导致很多场景不合理:
      
        function block(){
            var a = 1;
            if(true){
                var a = 2;
            }
            console.log(a)   //2
        }
        block()
    
    
        function block(){
            let a = 1;
            if(true){
                let a = 2;
            }
            console.log(a)    //1
        }
        block()
        上面的函数有两个代码块,都声明了变量a,运行后输出 1。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量a,最后输出的值才是 2
      
      
      ES6中的块级作用域:
          1、允许块级作用域任意嵌套,外层作用域无法读取内层作用域的变量
      {{{{  
          {let i = 6;}  
          console.log(i);  // 报错  
      }}}}  
            上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量。
     
          2、内层作用域可以定义外层作用域的同名变量
        
        {{{{  
            let i = 5;  
            {let i = 10;}
            console.log(i)  //5  
        }}}} 
    
        {{{{  
            let i = 5;  
            {
                let i = 10;
                console.log(i) //10
             }          
        }}}}  
          
      3、不需要立即执行匿名函数
         立即执行函数:   
    (function() {
          var  a = 0;
    }());

      块级作用域:

      {
         var a = 0;
      }
        
     块级作用域中的函数声明
        运行环境:ES6浏览器。
        可实现的行为:
        1、允许在块级作用域内声明函数
        2、函数声明类似于var, 即会提升到全局作用域或函数作用域的头部
        3、函数声明还会提升到所有块级作用域的头部
      
    function Func() {  
         console.log('outside');  
    }  
    (function() {  
         var Func = undefined;  
         if (false) {  
              function Func() {  
                  console.log('inside');  
              }  
         }  
       Func();  
    })();  //报错
        考虑到环境导致的差异太大,应该避免在块级作用域中声明函数,如果需要,应该写成函数表达式的形式,而不是函数声明语句
    let Func= function Func() {  
           console.log('inside');  
    }; 
    Func()
        
     ES6的块级作用域允许声明函数的规则只在使用大括号的情况下成立:
    'use strict'  
        if (true) {  
            function Func1() {} // 不报错  
        }  
        if (true)  
            function Func2() {} // 报错  
     
     
     
    -----------------从今天开始不定期连载ES6,主要是根据阮一峰的ES6文档以及其他的一些相关文档总结------------------
  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/shy0113/p/11851370.html
Copyright © 2011-2022 走看看