资讯专栏INFORMATION COLUMN

JS基础——作用域链与执行环境

Yi_Zhi_Yu / 3290人阅读

摘要:函数的作用域会在函数执行时用到,函数每次执行都会创建一个执行环境的内部对象,每个执行环境都有自己的作用域链。假设执行,其对应的作用域链如下函数执行过程中,变量的查找时从作用域头部开始查找,如果找到就是使用改变量的值。

每一个函数存在一个[[Scope]]内部属性,包含了一个函数被创建得作用域中对象得集合,这个集合为函数得作用域链。例如下面的全局函数:

fucntion add(num1, num2){
    var sum = num1 + num2;
    return sum;
}

当函数add被创建时,它的作用域链中便插入了一个对象变量,里面包含所有在全局范围内定义的变量。

函数add的作用域会在函数执行时用到,函数每次执行都会创建一个执行环境的内部对象,每个执行环境都有自己的作用域链。函数运行时,一个被称为活动对象的新对象就为执行环境创建好了,里面包含了函数的所有局部变量,命名参数,参数集合以及this。假设执行var total = add(5,10),其对应的作用域链如下:

函数执行过程中,变量的查找时从作用域头部开始查找,如果找到就是使用改变量的值。如果找不到就继续从作用域下一个对象查找,直到找到改变量。如过匹配不到,则为undefined。当频繁使用全局变量时,可以先使用一个局部变量保存起来,之后直接访问局部变量可以减少查找次数提高效率。例如:

function initUI(){
    var doc = document,
        bd = doc.body,
        links = doc.getElementsByTagName("a");
    ....
}

当函数执行完成,活动对象也会随之销毁。但闭包时,活动对象并不会销毁。这也是为什么闭包占用内存大的原因。

资料:《高性能JavaScript》第2章节

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102186.html

相关文章

  • 前端基础进阶(四):详细图解作用链与闭包

    摘要:之前一篇文章我们详细说明了变量对象,而这里,我们将详细说明作用域链。而的作用域链,则同时包含了这三个变量对象,所以的执行上下文可如下表示。下图展示了闭包的作用域链。其中为当前的函数调用栈,为当前正在被执行的函数的作用域链,为当前的局部变量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初学JavaScrip...

    aikin 评论0 收藏0
  • JS基础-作用域、作用链与闭包 Part three

    摘要:作用域执行上下文变量提前函数声明提前确定值范围一段或者一个函数都会生成一个执行上下文全局一段变量定义函数声明函数变量定义函数声明参数集合变量提前代码解析执行过程变量定义提前赋值函数声明提前代码解析函数声明函数表达式执行过程执行过程执行时才能 1.作用域 执行上下文 (变量提前、函数声明提前、确定this值、arguments) 范围:一段或者一个函数(都会生成一个执行上下文) ...

    heartFollower 评论0 收藏0
  • js深入(三)作用链与闭包

    摘要:在之前我们根绝对象的原型说过了的原型链,那么同样的万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链作用域链首先先来回顾一下之前讲到的原型链的寻找机制,就是实例会先从本身开始找,没有的话会一级一级的网上翻,直到顶端没有就会报一 在之前我们根绝对象的原型说过了js的原型链,那么同样的js 万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链 作用域链 首先先来回...

    blair 评论0 收藏0
  • “动静结合” 小白初探静态(词法)作用域,作用链与执行环境(EC)

    摘要:图片中的作用域链,是全局执行环境中的作用域链。然后此活动对象被推入作用域链的最前端。在最后调用的时候,创建先构建作用域链,再创建执行环境,再创建执行环境的时候发现了一个变量标识符。 从图书馆翻过各种JS的书之后,对作用域/执行环境/闭包这些概念有了一个比较清晰的认识。 栗子说明一切 第一个栗子 来看一个来自ECMA-262的栗子: var x = 10; (function foo(...

    Drummor 评论0 收藏0
  • 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用链与闭包

    摘要:在的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,等关键信息的变化。其中表示当前的局部变量对象,表示当前作用域链中的闭包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端开发中,有一个非常重要的技能,叫做断点调试。 在chrome...

    draveness 评论0 收藏0

发表评论

0条评论

Yi_Zhi_Yu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<