执行上下文(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. python_37_文件修改

    f=open('yesterday','r',encoding='utf-8') f_new=open('yesterday_update','w',encoding='utf-8') for lin ...

  2. PAT (Basic Level) Practise (中文)- 1001. 害死人不偿命的(3n+1)猜想 (15)

    http://www.patest.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那 ...

  3. Drupal的入门学习

    1. 注意content中的区别 Article和Basic page的区别 a.输入字段不一样,Article内容多了两个字段:tag和图片. b.内容的默认设置不一样,Article默认允许评论, ...

  4. N-gram的原理、用途和研究

    N-gram的原理.用途和研究 N-gram的基本原理 转自:http://blog.sciencenet.cn/blog-713101-797384.html N-gram是计算机语言学和概率论范畴 ...

  5. 零基础快速入门SpringBoot2.0教程 (三)

    一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...

  6. 第十二篇、OC_仿淘宝商品详情页的翻页

    // // GFBProductViewController.m // elmsc // // Created by MAC on 2016/11/26. // Copyright © 2016年 G ...

  7. nodejs fs路径

    引用:https://www.cnblogs.com/guangzhou11/p/7705257.html require()别的js文件的时候,将执行那个js文件. 注意: require()中的路 ...

  8. ES6箭头函数基本用法

    ES6箭头函数基本用法 ``` window.onload = function(){ alert(abc); } //箭头函数 window.onload = ()=>{ alert(&quo ...

  9. vue 项目中使用mock假数据实现前后端分离

    也是查了很多的资料,整理出来.实现了前后端的分离,用到的技术vue-cli,webpack,node,json-server.首先全局安装json-server cnpm i json-server ...

  10. 【python学习】新手基础程序练习(二)

    Ι 继续上一节得内容,这里主要是对各种知识的理解以及如何运用. 一.执行 Python 脚本的两种方式 1.把python执行文件加到计算机的环境变量中,然后新建文件把程序写在新文件里,再通过cmd命 ...