首先介绍一些即将用到的概念:

执行环境:
 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中。
 
所有javascript代码都是在一个特定的执行环境中被执行的,当调用一个javascript函数时,就会创建相应的执行环境,如果又调用另外一个函数,则又会创建一个新的执行环境,当调用函数返回后,执行过程会返回原始的执行环境,所以javascript的执行环境明显是按照栈的形式存储,即这一系类的执行环境构成了一个执行环境栈。在函数执行完成之后,栈将其环境弹出,把控制权返回给之前的执行环境。函数一旦执行完成,则该环境被撤销,其中的变量对象也随之消亡。
关系如下:
 
在一个函数的执行环境中,会创建一个活动“对象”,接下来创建一个类数组的arguments对象,它以整数索引的数组成员一一对应地保存着调用函数时所传递的参数,同时具备length,callee等属性,然后活动对象创建一个名为arguments的属性,该属性引用前面创建的arguments对象。接着为执行环境分配作用域,指定给一个函数调用执行环境的作用域,由该函数的scope属性所引用的对象列表链组成,同时,活动对象被添加到该对象列表的顶部,即链的前端。最后来说this,如果赋的值是一个对象的引用,则this指向该对象,如果赋null,则this指向全局对象。活动对象包含了arguments,this,及其可变对象属性。

作用域链:

当一个function被javascript引擎调用执行时,会创建一个变量对象的作用域Scope,并且被加到Scope链中。然后,将一个名为Call Object的调用对象加到当前的Scope的最前面。这个调用对象在初始化时会加入一个名为arguments的属性,用来引用function调用时的参数。如果这个function显示的调用了参数,那么这些参数也会被加入到这个对象中。

调用对象时function在运行时的Scope,其中包含了function在运行时的全部参数和局部变量。所以,当我们在函数内部调用一些参数或者变量时,实质上是访问的调用对象的属性

总结一下他们的关系:当函数作为构造函数调用时,比如:

function Person(){}

Person.prototype.sayName=function(name){alert(name)}

var person1=new Person();

person1.sayName("wenber");

在创建函数Person时:该函数Person就有一个prototype属性,即Person.prototype,它指向Person的原型对象Prototype。(这里有点绕,可以这么理解,Person的一个属性叫做prototype,这个属性又指向一个对象叫做Prototype,与此同时,这个叫做Prototype的对象它也有个属性叫做constructor,它指向了Person本身;

当实例化对象Person,也就是执行了构造函数Person,该实例person1又具有一个叫做_proto_的属性,它指向Person的原型对象Prototype(记住不是Person本身)。
如图:

js中的执行环境和作用域链的更多相关文章

  1. js中的执行环境及作用域

    最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...

  2. JS中的执行环境和作用域

    window 是最大最外围的执行环境,然后每个函数都有自己的执行环境.JS代码是从上到下执行的,单纯的用语言描述可能会有点绕,而且不大直观.我们看着代码来 console.log('global be ...

  3. JavaScript之一: 闭包、执行环境、作用域链

    这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...

  4. JS执行环境,作用域链及非块状作用域

    JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...

  5. javascript中函数的执行环境、作用域链、变量对象与活动对象

    javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...

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

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

  7. VO、AO、执行环境和作用域链

    1.变量对象(variable object) 原文:Every execution context has associated with it a variable object. Variabl ...

  8. JavaScript:理解执行环境、作用域链和活动对象

    作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...

  9. Javascript执行环境、作用域链

    执行环境 可以把执行环境想象为一个圆圈,里面包含了一些变量.函数. 执行环境定义了变量或函数的有权访问的其他数据,决定了它们各自的行为.还有一个顶部执行环境.在浏览器中,顶部执行环境既为window, ...

随机推荐

  1. 3Sum,4Sum问题

    //三数和为0的问题.要求去重,并且输出数字有序.public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(n ...

  2. Flume-NG源码阅读之HBaseSink

    关于HBase的sink的所有内容均在org.apache.flume.sink.hbase包下. 每个sink包括自己定制的,都extends AbstractSink implements Con ...

  3. JNI_C#

    1. 基本就是 通过 JAVA --> C/C++ --> C#的DLL 2. (1).自己写 JNI与 C#的DLL 通信 http://www.cnblogs.com/yinhaimi ...

  4. MySql基础学习-mysql安装

    Linux环境下的安装 1检查是否已经安装 sudo service mysql start #若未安装,则提示: mysql: unrecognized service 2安装MySql #安装 M ...

  5. 阿里云 linux 找回mysql root密码

    不小心手贱修改了密码,而且使用phpMyAdmin这种自动生成密码,又没记录密码,真实醉了   搜了半天,问题多多,想过回滚磁盘到昨天,在阿里云已经买了付费找密码 最后终于自己解决了,其实很简单 cd ...

  6. json与NSString转换

    json to string NSData *jsonData = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWriting ...

  7. SQL group by底层原理——本质是排序,可以利用索引事先排好序

    转自:http://blog.csdn.net/caomiao2006/article/details/52140993 由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比 ...

  8. Tomcat部署项目后有括号的处理方法

    常见的问题,收录整理了一下,方便查找. 如下3个地方都修改为一致即可解决. 1,右键项目名 --> properties --> 输入web project settings --> ...

  9. 【Oracle】容易犯的错误和技巧集合

    引言      此文记录日常开发中容易遇到的oracle编程误区和一些使用技巧,不定期更新. 1.sum(),max(),min(),avg()等函数会得到null值 declare n_num ): ...

  10. Django 基础 web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. import socket sk ...