zoukankan      html  css  js  c++  java
  • ecma2623执行环境

    最好别看我的译文,我自己都觉得不行。最好看原版英文的。
    html版本地址   http://bclary.com/2004/11/07/#a-10
    pdf版本地址 http://www.mozilla.org/js/language/E262-3.pdf

    翻译
    10 执行环境
    当控制器到了可执行代码前时,控制器就进入了一个执行环境。活动的执行环境通常是在栈中的。在栈头部的执行环境就是正在执行的执行环境。

    10.1定义
    10.11函数型对象
    有两种函数型的对象。
    在源代码中通过 函数声明 或者 动态的 通过函数表达式 和 new Function 的形式
    语言内建的内部函数,如parseInt等,我们暂时不讨论。这些函数不包括ecmascript语法中的可执行代码,所以这些函数不在本节执行环境的讨论之内。


    10.1.2可执行代码的类型
    有3中ecmascript可执行代码
    1.全局代码.在ecmascript源程序中的文本代码就是全局代码,一个特定程序的全局代码不包括源程序中的要被解析的函数体部分。
    2.eval代码.是在eval函数中的文本代码。更确切的说,如果eval函数的参数是个字符串的话,那就会被作为ecmascript程序。对于一次特定的eval代码调用,eval代码是全局代码区域
    3.函数代码.是在源程序文本中的函数体中的代码。一个特定的函数体中的代码不包括内嵌的函数部分。一个特定函数体内的函数代码当然也可以通过内置的Fucntion构造器来使用。更确切的说,Function构造器的最后一个参数将会被转化为函数体中的字符串。如果参数多于一个的话,最后一个参数会被作为函数体,其他参数都将被转换成用逗号隔开的字符并且连接在一起作为声明了的函数的参数列表.一个Function实例中的函数代码也不包括内嵌的函数体部分.

    10.13变量实例化
    每一个执行环境都联系着一个变量对象。在源程序文本中声明的变量和函数被用作变量对象的属性。对于函数代码来说,函数的参数被用作变量对象的属性。
    变量对象和它的属性的类型是根据代码的类型决定的,但是其他的行为是相同的。当进入执行环境的时候,通过下面的顺序,一些属性被添加到变量对象中。
    对于函数代码:在函数中声明的每一个参数被用作变量对象的属性,它的名字就是标识符的名字,它的类型是根据代码的类型决定的。函数参数的值可以通过arguments来访问。如果被调用函数中声明的参数比调用函数传的值多,那其他的值就被定义为undefined。如果函数的参数名字有相同的时候,后面声明的参数会被得到值,如果后面的声明的参数没有得到值,这个同名的参数会被定义为undefined。
    对于在代码中的每一个函数声明,按照源代码文本的顺序,给变量对象创建一个属性,这个属性的名字就是函数声明时的名字。这个属性的值是在创建Function对象时返回的(13节),这个属性的类型是根据代码的类型决定的。如果变量对象已经有了一个同名的属性,那就替换这个值和类型。从语法上来说,这个步骤必须是在创建函数参数列表属性完成之后。
    对于代码中的每一个声明的变量和没经过声明的变量,在变量对象中创建一个以变量名字命名的属性,它的值是undefined,它的类型是由代码的类型决定的。如果声明的变量名已经在变量对象的属性中存在了,那它的值和类型都被不会被替换。语法上说,这个步骤必须在创建函数参数列表属性和函数声明属性结束后。尤其,如果一个声明的变量和一个声明的函数名字或者函数参数的名字相同的话,这个变量声明不会打乱已存在变量对象的属性。

    10.1.4作用域链和标识符解析
    每一个执行环境都关联这一个作用域链。一个作用域链是在一系列的当解析标识符时被寻找的对象。当控制器进入了一个执行环境,一个作用域链被创建了并且填入了一个根绝代码类型初始化的对象。在一个执行环境中执行的时候,执行环境的作用域链只受到with语句和catch从句的影响 (见12.14)
    在执行的时候,通过下列进行标识符解析:
    1 进入作用域链中的下一个对象。如果不存在,走第5步
    2 调用结果1的hasProperty方法,把标识符作为属性传递
    3 如果结果2是真,返回一个以标识符作为属性名,以结果1作为引用的对象
    4 进入第一步
    5 返回一个以标识符为属性名,以null作为基础对象的,引用类型的对象
    解析标识符的结果通常都是一个引用值,这个引用值中的成员的名字是和标识符相同的。

    10.1.5全局对象
    只有一个全局对象(见15.1)。这个全局对象是在控制器进入执行环境前创建的,最初全局对象有下列属性:
    1内建的对象如,Math,String,Date。这些对象是不能被枚举的(dontEnum)
    2另外的有浏览器定义的属性。这个可能包括全局对象自己的一个属性。例如,在HTMLdom对象模型中的全局对象的window属性是全局对象自己。
    当控制器进入执行环境,ECMAScript代码被执行,其他属性可能会被添加到全局对象,初始化属性可能会被改变。

    10.1.6 活动对象
    当控制器进入一个函数代码的执行环境,一个被叫做活动对象的对象被创建了并和执行环境关联起来。这个活动对象初始化了一个不能被删除的(dontdelete)arguments属性。这个属性的初始值是如下描述的函数参数对象:
    这个活动对象然后被用作了以变量实例化为目的的变量对象活动对象可以纯粹的一个规范。活动对象不能够被ecmascript程序访问到,但是可以访问活动对象成员的值。当调用一个引用活动对象的值时,this=null。

    10.1.7 this
    每一个执行环境中都有一个this值。this值是在控制器进入执行环境的时候,根据调用者和被执行代码的类型决定的。和执行环境关联的this的值是不可改变的。

    10.1.8 函数参数对象
    当控制器进入了一个函数代码的执行环境,一个arguments对象被创建了,并且按如下方式初始化:
    1arguments对象的prototype属性是原始的Object的prototype,值就是Object.prototype的值。(15.2.3.1参照)
    2一个以callee命名的属性和类型{DontEnum}被创建了,这个属性的初始的值就是函数对象被执行,这允许匿名函数递归。
    3一个以length命名的属性和类型{DontEnum}被创建了,这个属性的初始的值是调用函数的实际参数的数量
    4对每一个argument,如果是比length的值少非负整数,一个以ToString命名的属性和类型被创建了。这个属性的初始的值是和调用函数的实际参数的值一致的。第一个个实参的值=arguments[0].然后依次。对于Fuction对象来说,如果arg比声明的参数少,这个属性的值就和活动对象属性的值一致。这意味着改变这个属性的值也就改变了活动对象属性的值,返过来也一样。

    10.2进入执行环境
    每一个函数和构造器的调用都会进入一个新的执行环境,即使一个函数是在递归的调用它自己。每一个return存在于一个执行环境中。一个错误抛出,如果没有被抓住的话,可能导致存在多个执行环境。当控制器进入一个执行环境,作用域链被创建并且初始化,变量实例化,然后决定this的值
    作用域链的初始化,变量实例化,和this值的决定都是根据被执行代码的类型决定的。
    10.2.1 全局代码
    1作用域链的创建和初始化是为了包含全局对象
    2变量实例化,使用全局对象作为变量对象,不能被删除(dontdelete)
    3this的值是全局对象
    10.2.2 eval代码
    当控制器进入一个eval代码的执行环境,原先的活动的执行环境通过指向到了正在调用的环境来决定作用域链,变量对象和this的值。如果没有正在调用的环境,那就初始一个作用域链,变量实例化,和通过全局代码决定this的值。
    1作用域链初始化是为了包含相同的对象,按照同样的顺序,作为正在调用的作用域链环境。对象会添加到正在调用的作用域链环境通过with和catch语句
    2变量的实例化是通过调用变量对象的环境和使用空的属性
    3this的值是和正在调用环境的this的值相同的
    10.2.3 函数代码
    1作用域链被初始化是为了包含活动对象,这个活动对象存储在函数对象的scope属性中
    2变量实例化,使用活动对象作为变量对象,并且不能被删除(dontdelete)。
    3调用者提供了this的值。如果提供this值的调用者不是一个对象,那这个this的值就是一个全局对象。

    我画的图:

    下面这个图是高性能书上的
    是相对于这个代码的

    function add(num1, num2){
    var sum = num1 + num2;
    return sum;
    }
    var total = add(5, 10);
    

  • 相关阅读:
    耐人寻味的 8 幅Java技术图
    什么是线程安全?怎么样才能做到线程安全?
    线程池
    ExecutorService的正确关闭方法
    js中let和var定义变量的区别
    sql的left join 、right join 、inner join之间的区别
    Collections.sort排序
    Mysql声明变量及使用
    java集合容器汇总
    TortoiseSVN提交commit提示Unable to create pristine install stream.系统找不到指定的路径 之解决方法
  • 原文地址:https://www.cnblogs.com/lunalord/p/1988759.html
Copyright © 2011-2022 走看看