博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
作用域、执行环境、作用域链
阅读量:6489 次
发布时间:2019-06-24

本文共 1087 字,大约阅读时间需要 3 分钟。

作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域。因为有函数作用域,所以我们有全局作用域和局部作用域的说法。

执行环境是什么?执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的虚拟的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

简单说就是每一个函数就有一个执行环境,函数里面的变量和函数都要通过这个函数去访问。对于外部环境来说,每一个函数也是一个变量对象。每一个函数都有一个初始化的argument变量。

JavaScript中最大的全局执行环境是window,执行环境要在所有代码执行完毕才会被销毁,而全局执行环境window只有关闭网页或者关闭浏览器才被销毁。

当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。

讲的有点抽象了,通过代码或许更直观:

复制代码

全局作用域window,局部作用域fun1,;全局执行环境window,局部执行环境fun1;window有自己的变量对象,就是window本身,window可以通过这个变量对象去访问变量a和变量对象fun1。

当fun1执行的时候创建了一个作用域链,所以fun1有两个变量对象,一个是自己,一个是全局环境的变量对象window。fun1可以在函数内部访问变量a,因为fun1所在的作用域链可以找到变量a。

再比如:

var a = 5;function fun1() {    var b = 6;    function fun2() {        var c = 7;    }}复制代码

这段代码有三个执行环境:全局环境window、局部环境fun1、局部环境fun2;

全局环境Window有一个变量a和一个函数fun1;

局部环境fun1有一个变量b和一个函数fun2,但是fun1可以访问全局环境的变量a;

局部环境fun2有一个变量c,但是fun2可以访问fun1环境中的变量b和全局环境的变量a;

这就是作用域链,作用域链中的内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。作用域链中,每一个局部环境都会首先寻找自身环境中的属性和方法,搜索到了就停止寻找,没有找到再向上搜索直到最外层window还搜索不到就报错。

欢迎关注Coding个人笔记 公众号

转载于:https://juejin.im/post/5c501f72e51d4551e653dac4

你可能感兴趣的文章
mysql数据库授权学习记录
查看>>
在 Docker容器中安装WebSphere 8.5
查看>>
CentOS 6更改系统时间后无法启动的解决办法
查看>>
如何实现将默认路由重分发进入OSPF和RIP协议
查看>>
备忘录模式(Memento)
查看>>
月薪3千与3万文案的区别!一字千金就体现在细微之处
查看>>
总结:正则表达式
查看>>
键盘控制----回显与行输入设置
查看>>
linux加入windows域之完美方案
查看>>
Dell T310服务器安装Windows 2008介绍
查看>>
深度学习与 Spark 和 TensorFlow
查看>>
ikanalyzer 词频计算
查看>>
Netty 说明
查看>>
jquery 进度条
查看>>
一直在找寻的问题,微博告诉了我答案
查看>>
关于Eclipse中的几个编码设置
查看>>
调用动态库!
查看>>
对于vs2012等高版本对scanf报警的
查看>>
Oracle存储过程遍历结果集
查看>>
Zebra_Pagination分页
查看>>