函数的之作用域链

作用域链

每个函数都会形成一个自己词法空间我们也叫做作用域,外部的环境无法读取函数内部定义的内容;但是被定义在函数内部的函数可以读取到外层函数作用域下的内容。
每个作用域都是作用域链上的一个元素,最内层函数就是的作用域链的起始端具有最高的优先级,外层函数是作用 域链的下一个元素节,就这样一直延伸window作用域。

例子

function outside() {
    const name1 = "one";
   // console.log(name2); //报错
    function inside() {
        const name2 = "two";
        console.log(name1); // one
    }
    inside();
}
outside();

以上代码的作用域链顺序为 inside,outside,window;

函数作用域链中的命名冲突

产生条件

闭包[注释1]情况下,作用域链的前端和作用域链的后一个元素中定义的变量相同就会产生变量冲突

优先级高低

越靠近作用域的优先级就越高。

例子
function outside() {
    var x = 5; // 是outSide函数作用域下的变量
    console.log(x); //5 var
    function inside(x) { // x是inside函数作用域下的变量
      return x * 2;
    }
    return inside;
  }
 // 
 const res = outside()(10); 
 console.log(res);// 20
  • 以上代码的作用域链的顺序是什么?

用域链顺序inside,outside, window

  • x为什么是10呢?

inside作用域下定义了x和下一个outside作用域中定义的变量名相同,此时就产生了变量名冲突。变量冲突的时候始终采用就近原则。因此会用inside的形参而不是outside作用域下定义的x

注释

  • 注释1
    所谓的闭包,一个函数和外层函数作用域中定义的变量捆绑一起,什么捆绑呢?作用域链的前端引用了作用域链后面的作用中的变量,导致作用域链后面作用域或者说函数调用栈无法被销毁。
    此时我们可以理解为套间中的一个人拿了大门药匙导致套间外的人也无法打开门出去

以上是个人对作用域链的理解,有问题的地方欢迎各位好友在下方评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值