数据类型_function_作用域与作用域链

作用域

在js中,作用域分为全局作用域、函数作用域与块级作用域(Es6新增的);

全局作用域
  • 定义:直接编写在jscript标签中的js代码,都在全局作用域中;
  • 全局变量:全局作用域中定义的变量被成为全局变量;
  • 全局变量的生命周期:在页面打开时被创建,在页面关闭时被销毁;
  • 全局变量的访问时机:全局变量在页面的任何位置都可以访问到;
  • 在全局作用域中存在一个全局对象window,代表浏览器窗口;
    • 使用var 定义的变量全部作为window的属性;
    • 全局作用域中创建的函数全部作为window的方法;
函数作用域
  • 定义:每当函数被创建的时候,都会产生一个函数作用域;
  • 局部变量:函数作用域中定义的变量被称作局部变量;
  • 局部变量的生命周期:函数调用时被创建,函数执行完毕被销毁;
  • 局部变量的访问时机:仅在函数内部可以访问;
块级作用域
  • 块级作用域是Es6新增的作用域类型;

  • 定义:除对象的{}外,每一个{}都会生成一个块级作用域;

  • 局部变量:在块级作用域内部使用let与const定义的变量被称为局部变量;

    • 若是使用var关键字定义变量–js没有块级作用域!

    • 若是使用let与const关键字定义变量–js存在块级作用域!

    • var name="global";
      if(true){
             
          var name="local";
          console.log(name) // "local"
      }
      console.log(name); // "local"
      
    • const name="global";
      if(true){
             
          const name="local";
          console.log(name) //"local"
      }
      console.log(name); //"global"
      
    • 例1中解析过程

      // 1.使用var定义变量存在变量提升,提升到当前作用域的最顶端;
      // 2.使用var定义变量不存块级作用域---因此这两次name变量提升都是提升到全局作用域的最顶端;
      var name 
      name = "global"
      if(true){
              
         name="local";
         console.log(name) // local
      }
      if(true){
              
         console.log(name) // global
      }
      console.log(name);  // global
      

      例2的解析过程

      //1.使用let与const定义变量不存在变量提升;
      // 2.使用let与const定义变量存在块级作用域
      const name="global";
      if(true){
              
         const name="local";
         console.log(name) // 3.访问-发现块级作用域中存在name变量,访问块级作用域中的name变量
      }
      if(true){
              
         console.log(name) // 4.访问-发现块级作用域中不存在name变量,顺着作用域链向上一级作用域中寻找 
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值