zoukankan      html  css  js  c++  java
  • Js作用域与作用域链

    今天逛社区,无意间看到一段JS代码,感觉挺有意思,记录下来。

    代码:

     1 <script>
     2 var money =110;
     3 function say()
     4 { 
     5     alert(this.money);
     6     alert(money);
     7     var money = 200;
     8     alert(money);
     9 }
    10 say();
    11 </script>

    运行结果:

    突然看到的时候不假思索的就认为输出的是110,110,200,后来发觉自己错了。原来这里面有个 Js作用域与作用域链。

    在js里面,当方法执行的时候会为方法产生一个执行环境,环境里面有方法的作用域链。这个作用域链我把它理解为指令集一样的东西。

       this.money是直接访问windows作用域里的money,因为say函数的调用者是window,所以this就是window。

       第一个alert(monry)先去say方法的作用域里面找money,找到了,但是没有赋值,因为var money = 200语句没有执行,money只是声明了一个变量,所以是undefined。

       var money = 200是在say方法里面给money变量赋值

       第二个alert(money)执行的时候,又是通过函数的作用域去找money,也找到了,但是这次money已经赋值了,为200。

    网上找的一个关于js作用域与作用域链的例子:

     1 <script>
     2 var money =110;
     3 function say()
     4 { 
     5     alert(this.money);
     6     alert(money);
     7     var money = 200;
     8     alert(money);
     9 }
    10  person={name:"yhb",age:22,height:175,wife{name:"lwy",age:21}}; 
    11 with(person.wife){
    12   alert(name);
    13 }
    14 say();
    15 </script>

    运行结果:先弹出lwy后面的三个顺序和上面一样

      with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。with语句将person.wife添加到当前作用域链的头部,所以输出的就是:“lwy"。 with语句结束后,作用域链恢复正常。

  • 相关阅读:
    项目开发环境
    angluarjs2入门学习资源
    mosquitto安装和测试
    loj#6031. 「雅礼集训 2017 Day1」字符串(SAM 广义SAM 数据分治)
    loj#6030. 「雅礼集训 2017 Day1」矩阵(贪心 构造)
    loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
    HDU4609 3-idiots(生成函数)
    loj#6436. 「PKUSC2018」神仙的游戏(生成函数)
    BZOJ3028: 食物(生成函数)
    洛谷P4841 城市规划(生成函数 多项式求逆)
  • 原文地址:https://www.cnblogs.com/sening/p/4456492.html
Copyright © 2011-2022 走看看