对javascript中的Variable Object的理解


Variable Object

ECMAScipt中,通过变量对象Variable Object (VO)机制来存贮、访问变量variables。VO中包含了:

1. variables (通过var 声明的变量)

2. function declaration (函数声明)

3. function formal parameters (函数行参)

: 不包括function expression (函数表达式)。

Variable ObjectGlobal Context中等同于Global Object,在Function Context中称为Activation Object (AO)
一般来讲,
Variable Object
/ Activation Object 我们不能直接在外部访问到。

要访问某个变量x,首先在x所在Function Context中的Variable Object中查找,
若找不到,则在x所属function[[scope]]属性中保存的scope chain中,
逐级向上查找,直至查找到Global Object,如果仍未找到则返回 x is not defined 。

我们所常见的window对象实际上是Global Object的引用,所以通过varGlobal Context中声明的变量x
可以通过x直接访问,也可通过window.x来间接访问,并且通过window.x访问比直接访问要慢

    var a = "variable";
    b = "property";

    console.log(window.a);  // "variable"
    console.log(window.b); // "property"

    delete window.a;  // false
    console.log(window.a); // "variable"

    delete window.b; //true
    console.log(window.b);  //undefined;

在上面的例子中, 虽然都能通过window.a, window.b的形式来访问,看似都是window的属性,但是实质是不同的。

不使用var声明的”变量“,实际不是真正的变量,而是Global Object的属性,可以通过delete 关键字删除,而真正的变量拥有DontDelete属性,不能通过delete删除。

但值得注意的是,在firebug中,执行

    delete window.a;  //true
    delete window.b;  //true

返回值都是true,这是由于在eval context中,变量不会被添加DontDelete属性,firebug正是利用eval来执行我们在console中的代码,而在chrome,opera的console中则返回正确的false,true

参考

http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object

迁移自旧博客懒蜗牛


文章作者: Caden
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Caden !
 上一篇
android不同系统版本sd的挂载方式 android不同系统版本sd的挂载方式
2.x系统sd卡实际挂载位置 /mnt/sdcard 并建立了一个/sdcard的软链接指向/mnt/sdcard /sdcard/ --> /mnt/sdcard Android 2.2之后的版本允许将应用程
2014-11-01
下一篇 
canvas、bitmap、paint之间是什么关系 canvas、bitmap、paint之间是什么关系
官方文档翻译过来的解释: 要绘图,需要4个基本组件: Bitmap 保存像素的容器 Canvas 执行绘图命令的宿主 Rect/Path/text/Bitmap 要绘制的元素 Paint 用什么样的方式绘制 android的canvas
2014-04-13
  目录