开心菜鸟系列学习笔记------javascript(4)

   
    一、全局上下文中的变量对象:
        1)全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;
这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。
        2)全局对象的window属性就可以引用全局对象自身(当然,并不是所有的具体实现都是这样
        3)回到全局上下文中的变量对象——在这里,变量对象就是全局对象自己:
        4)非常有必要要理解上述结论,基于这个原理,在全局上下文中声明的对应,我们才可以间接通过全局对象的属性来访问它(例如,事先不知道变量名称)。

    二、函数上下文中的变量对象
    1)在函数执行上下文中,函数名是不能直接访问的,此时由活动对象(activation object,缩写为AO)扮演VO的角色。
    2)
        Arguments对象是活动对象的一个属性,它包括如下属性:
        1.callee — 指向当前函数的引用
        2.length — 真正传递的参数个数
        3.properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。
        3)进入执行上下文

        当进入执行上下文(代码执行之前)时,VO里已经包含了下列属性(前面已经说了):

        函数的所有形参(如果我们是在函数执行上下文中)

        — 由名称和对应值组成的一个变量对象的属性被创建;没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也将被创建。

        所有函数声明(FunctionDeclaration, FD)

    —由名称和对应值(函数对象(function-object))组成一个变量对象的属性被创建;如果变量对象已经存在相同名称的属性,则完全替换这个属性。

所有变量声明(var, VariableDeclaration)

    — 由名称和对应值(undefined)组成一个变量对象的属性被创建;如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。
    函数表达式不会影响VO。
    终于明白 function (){}; //后面为什么要分号,因为如果后面出现了括号,那怕是在下一行的话也会执行这个函数的,变量声明在顺序上跟在函数声明和形式参数声明之后。
    4)如果没有用var声明变量,这仅仅是给全局对象创建一个新的属性。并不是说他不可以改变,而是指它并不符全ECMAcript规范中的概念,
 所有的根源仍然是Vo和进入上下文阶段和代码执行阶段,没有用Var声明的,在进入上下文阶段,并没有值。而用var声明的变量,是会赋予初值undefined。还有一个知识点就是,delete不可以删除var声明的变量


 

原文地址:https://www.cnblogs.com/kaixincainiao/p/3415624.html