js 作用域与作用域链

js的作用域分为全局作用域与函数作用域、但是在es6之前js没有块级作用域因此

for(var i =0;i<10;i++){

}
console.log(i)

 输出的是10

实现跨级作用域的方法例如(IIFE)立即调用函数表达式。在闭包中经常看见

(function(){
for(var i =0;i<10;i++){

}
})()
console.log(i)

如果在申明变量时没有使用var关键字呢么默认为全局变量,只要函数内定义了一个局部变量,函数在解析的时候都会将这个变量“提前声明”:例

   <script>
      var scope = "global";
      function fn(){
         console.log(scope);//result:undefined
         var scope = "local";
         console.log(scope);//result:local;
      }
      fn();
   </script>

在浏览器环境编译时上面的代码会被自动编译为

 var scope = "global";
      function fn(){
         var scope;//提前声明了局部变量
         console.log(scope);//result:undefined
         scope = "local";
         console.log(scope);//result:local;
      }
      fn();

  作用域链 在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。 

function outer(){
         var scope = "outer";
         function inner(){
            return scope;
         }
         return inner;
      }
      var fn = outer();
      fn();

outer()内部返回了一个inner函数,当调用outer时,inner函数的作用域链就已经被初始化了(复制父函数的作用域链,再在前端插入自己的活动对象),具体如下图: 
闭包作用域链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值