执行上下文(Execution context,简称EC)
 
概念
 
每当控制器到达ECMAScript可执行代码的时候,就进入了一个执行上下文。
 
javascript中,EC分为三种:
 
全局级别的代码(全局执行上下文)
函数级别的代码(函数执行性上下文)
Eval的代码(eval执行上下文)
 
执行上下文对象包括三个关键属性,可能有其他自定义属性。
 
VO(Variable object), 变量对象 或者 AO(activation object),活动对象,是个字典,包括函数arguments对象,形参,内部变量,函数声明
 
Scope chain,作用域链对象,包括当前作用域的vo和所有父级作用域的vo。
 
this对象,Context object,上下文对象。
 
 
作用域链的链式结构
 
作用域链的链式结构,是AO有个父级变量对象的引用,用
__parent__内部属性指代。则通过对父级的应用形成一种
链式结构,如下图
 
作用域链结构图片
 
执行上下文的执行过程
 
EC的建立分为两个阶段:进入执行上下文阶段和代码执行阶段
 
1.进入上下文阶段
 
发生在函数调用时,在执行具体代码之前。做如下三件事:
创建作用域链(Scope Chain)
创建变量对象
设置this对象的值,this对象的值取决于对象的调用者,caller和调用方式决定了this的值。
 
变量对象中的变量值如下:
根据函数参数创建并初始化arguments对象
函数声明创建属性,关联具体函数
变量初始化为undefined(所谓变量提升)
 
同名覆盖原则
函数声明与参数同名 函数声明覆盖参数
变量与函数声明或参数同名,变量赋值前其有效
 
2.代码执行阶段
 
变量赋值
解释执行其他代码
 
执行上下文的创建会形成一个栈,新创建的执行上下文入栈,执行完毕则出栈。
 
程序执行时,首先进入全局执行上下文,Global Context入栈,
在全局中有函数调用,则会进入函数执行上下文,函数执行上下文入栈
 
执行上下文栈 图片
 
闭包

定义

包含自由变量的函数就是闭包(自由变量指不是函数参数,也不是函数内部变量的变量,即外部变量)
该函数通常为内部函数,被返回,外部可以引用该函数,通过其访问自由变量。

闭包的用途

1. 读取函数内部的变量
2. 让变量的值始终保持在内存中,比如循环注册事件,在事件中访问循环变量,需要用闭包来保持循环变量
3. IIFE(立即调用的函数表达式),在引用了外部变量的时候,也会形成闭包,形成一个独立的作用域,防止变量污染

闭包注意点

1. 闭包会使得父级作用域的变量都被保存在内存中,内存消耗大,在IE中可能会导致内存泄漏。少用闭包,或者将不使用的局部变量全部删除
2. 父级作用域的变量是共享,一个闭包修改了变量的值,其他闭包的值获取的值也会发生变化,容易产生错误

javascript作用域链理解的更多相关文章

  1. JavaScript作用域链的理解

    前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...

  2. JavaScript 作用域链图具体解释

    <script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...

  3. 个人理解的javascript作用域链与闭包

    闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...

  4. javascript学习中自己对作用域和作用域链理解

    在javascript学习中作用域和作用域链还是相对难理解些,下面我关于javascript作用域和作用域链做一下详细介绍,给各位初学者答疑解惑. 首先我们介绍一下什么是作用域?  从字面上理解就是起 ...

  5. JavaScript作用域链与闭包的理解

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域 链的工作原理. 1. 全局作用域(Global Scope) (1)最外层函数和 ...

  6. javascript深入理解-从作用域链理解闭包

    一.概要 红宝书(P178)对于闭包的定义:闭包就是有权访问另外一个函数作用域中变量的函数. MDN,对于闭包的定义:闭包就是指能够访问自由变量的函数. 那么什么是自由变量?自由变量就是在函数中使用, ...

  7. 【进阶2-2期】JavaScript深入之从作用域链理解闭包(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记   https://github.com/yygmind/blog/issues/18 红宝书(p178)上对于闭包的定义:闭包是指有权访问另外一 ...

  8. javascript 作用域、作用域链理解

    JavaScript作用域就是变量和函数的可访问范围. 1.变量作用域 在JavaScript中,变量作用域分为全局作用域和局部作用域. 全局作用域 任何地方都可以定义拥有全局作用域的变量 1.没有用 ...

  9. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

随机推荐

  1. CUDA中记录执行时间-GPU端

    事件eventcudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord ...

  2. CUDA编程时,线程块的处理方法

  3. Bootstrap 附加导航(Affix)插件

    bootstrap 附加导航(Affix)插件允许某个div元素固定到页面中的某个位置.您可以打开或关闭使用该插件之间进行切换 后续再写

  4. C# checked运算符

    一.C# checked运算符 checked运算符用于对整型算术运算和显式转换启用溢出检查. 默认情况下,表达式产生的值如果超出了目标类型的范围,将会产生两种情况: ?常数表达式将导致编译时错误. ...

  5. shell脚本,awk实现跳过文件里面的空行。

    1.用awk '{if(!NF ){next}}1' file11 实现对文件里面的空行进行跳过操作,并输出结果. 2. awk '{if(!NF || /^#/){next}}1' file11 实 ...

  6. VPS搭建***

    yum -y install epel-release** yum update yum -y install python-setuptools m2crypto supervisor easy_i ...

  7. matplotlib(二)——matplotlib控制坐标轴第一个刻度到原点距离

    一.问题描述 具体问题是: 用python库matplotlib进行数据的图表展示: 横坐标是自定义统计值: 保存矢量图(svg),保存后发现横坐的第一个点离坐标原点距离较大,导致图形离y轴较远,让画 ...

  8. Fakeapp 入门教程(2):使用篇!

    Fakeapp软件的使用主要分成了三个步骤, 使用之前请确保你的电脑配置还可以,推荐配置是:一张显存大于4G的N卡.Fakeapp是有支持CPU选项,但是用CPU跑非常慢. 获取脸部图片 训练模型 生 ...

  9. commons-logging日志实现解耦

    一.需要解耦      日志是实际应用中的一个重要部分,日志系统也有许多开源的实现,如java.util.logging, logback, log4j系列等.      在使用日志系统时,如果与具体 ...

  10. 动态规划:HDU1789-Doing Homework again

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...