1.执行环境(执行上下文)

先看段代码

var  a = 10;
var  b = 20;

function cc(){
var c = 30; alert("b="+b); } cc();
alert(c);//报错

为什么我们在函数cc中可以访问到全局变量b而外部却访问不了局部变量c呢?

这就是执行环境的作用:它定义了变量或函数是否有权访问其他数据,决定各自行为。

在javascript中有三种可执行的类型

1.Global Code,即全局的、不在任何函数里面的代码,例如:一个js文件、嵌入在HTML页面中的js代码等。

2.Eval Code,即使用eval()函数动态执行的JS代码。

3. Function Code,即用户自定义函数中的函数体JS代码。

不同的类型有不同的执行环境,我们只讨论全局执行环境和函数执行环境

2.每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中

在这个方框里就是一个大的执行环境对应的有一个变量对象,这个变量对象我们在程序中是没法访问它的,那它的作用是什么呢?

我们定义的变量a,b,函数cc都是定义在变量对象(variable Object),后台在解析的时候是解析的变量对象的,这就是变量对象的概念。

3.作用域链

看段代码

//执行环境window对象(最上层的执行环境)
var color1 = "blue";
function changeColor(){ //每一个函数都有一个执行环境
    var color2 ="red";
    function swapColor(){
        var color3 = color2;
         color1 = color3;
         //这里可以访问color1,2,3
     }
     //这里可以访问color1,color2,但不可以访问color3
    swapColor();
}
 //这里只能访问color1
changeColor();//第一个作用环境 changeColor是最外层的window作用域,

在上面的大的执行环境中,可以看到变量color1和函数changeColor,执行changeColor(),代码会从color2代码开始执行到完毕。

当代码执行到swapColor函数的时候,这个函数又产生了一个执行环境(因为每一个函数都有一个执行环境),

当执行到  var color3 = color2;代码中就相当于

    var color2 ="red";
    function swapColor(){
        var color3 = color2;
         color1 = color3;
         //这里可以访问color1,2,3
     }

color2是全局变量所以函数swapColor可以访问到。

当访问到swapColor()是不可以访问到color3的。

所以我们就得出一个作用域链的概念

当我们的执行环境依次执行到changeColor和swapColor时会产生一个链条,这个链条决定了整个变量的访问权限

环境变量一层一层的向上进行追溯,可以访问它的上级环境(变量和函数)

这就是作用域链的概念

就是一层一层的向上找

c3可以访问c2也可以访问c1  但不能向下访问 。

假设c1是一级作用域,c2是二级作用域,c3是三级作用域

在c3中访问c1它会怎么做呢

      1.先在swapColor函数内查找c1 结果没有发现c1

2.继续向上查找

3.发现c2作用域还是没发现c1

4.继续向上查找

5.找到c1

(完

下一章

javascript痛点之三闭包

javascript痛点之二作用域链的更多相关文章

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

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

  2. Javascript 运行上下文和作用域链

    一.作用域Scope和上下文Context 在javascript中,作用域scope和上下文context是两个不同的概念.每个函数调用都会伴随着scope和context,从本质上来说,scope ...

  3. 深度剖析Javascript执行环境、作用域链

    一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都 ...

  4. JavaScript 执行环境以及作用域链

    执行环境(execution context,为简单起见,有时也称为"环境")是 JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...

  5. JavaScript高级程序设计之作用域链

    JavaScript只有函数作用域:每个函数都有个作用域链直达window对象. 变量的查找由内而外层层查找,找到即止. 同时不仅可以查找使用,甚至可以改变外部变量. var color = &quo ...

  6. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  7. javaScript执行环境、作用域链与闭包

    一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...

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

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

  9. javascript 执行环境,作用域链和闭包

    首先看下这条语句: (function($) {…})(jQuery): 1.原理: function(arg){…}这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的, ...

随机推荐

  1. Java程序初始化的顺序

    Java程序初始化的顺序 java程序初始化工作可以在许多不同的代码块中来完成(例如:静态代码块.构造函数等),他们执行的顺序如下: 父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非 ...

  2. jwt token Example - Python

    0 Pre Install Python3 Install PyCrypto Install PyJWT 1 token 由三部分组成 header, payload, sign 并用逗号连接各部分 ...

  3. 【算法】RMQ LCA 讲课杂记

    4月4日,应学弟要求去了次学校给小同学们讲了一堂课,其实讲的挺内容挺杂的,但是目的是引出LCA算法. 现在整理一下当天讲课的主要内容: 开始并没有直接引出LCA问题,而是讲了RMQ(Range Min ...

  4. Nodejs进阶:MD5入门介绍及crypto模块的应用

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 简介 MD5(Message-Digest Algorithm) ...

  5. Ubuntu搭建mysql,Navicat Premium连接

    保存编辑结果与退出vim编辑器 https://jingyan.baidu.com/article/495ba8410ff14d38b30ede01.html 首先,我们需要使用apt安装mysql, ...

  6. [Day01] Python基础

    明天要完成的任务如下:  Python 四则运算 Python 数据结构 Python 元算符(in.not in.is.and.or) 用户输入 (input.raw_input) 流程控制 缩进 ...

  7. [效率]Source insight标题栏中路径显示完整路径的方法

    使用Source insight的时候,默认是不显示文件的全路径的,这一点有那么一段时间让我很纠结,因为很多函数都是基于硬件架构的,一个函数有很多时间.查看文件的全路径是非常有必要,可以通过以下实现: ...

  8. C#1所搭建的核心基础

    一,委托 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法接口. 委托类型声明中所描述的类型签名决定了哪个方法可以用于创建委托实例,同时决定了调用的签名:委托类型实际上只是参数类型的一个列 ...

  9. JavaScript中var变量引用function与直接声明function

    今天在h5开发app的过程中遇到了一个js问题,function的执行问题 在js中声明函数function有这两种方法 var A=function(){...} 或者 function A(){. ...

  10. 一天精通MongoDB数据库

    什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...