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语句结束后,作用域链恢复正常。

posted @   紫系流月  阅读(422)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示