前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >作用域、执行环境、作用域链

作用域、执行环境、作用域链

作者头像
wade
发布2020-04-23 17:26:20
1.5K0
发布2020-04-23 17:26:20
举报
文章被收录于专栏:coding个人笔记

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

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

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

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

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

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

代码语言:javascript
复制
<script>
    var a = 5;
    function fun1() {
        console.log(arguments)
    }
</script>

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

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

再比如:

代码语言:javascript
复制
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还搜索不到就报错。

(完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档