首页 > 在JavaScript中浏览器(或者其他宿主环境)对变量的搜寻有哪些方式?

在JavaScript中浏览器(或者其他宿主环境)对变量的搜寻有哪些方式?

初学者看了点书,突然对浏览器搜寻变量的方式感兴趣,就想问下SF的大神还有其他的方式么?作用原理是什么?最好有示例代码。
我知道有两种:
1、在执行环境中的使用一个变量(如argu)时,根据一个执行环境中存的作用域链上的指向各个执行环境的变量对象的指针的索引,去匹配某个变量对象中是否包含一个符合给定变量名("argu")的变量,从作用域链的前端往后查,直到全局作用域;如果一直没找到,那么这个变量就是全局变量;

var color = "red";

function foo1() {
    var color = "blue";

    function foo2() {
//        var color = "green";
        console.log(color);
    }
    foo2();
    console.log(color);
}
foo1();
console.log(color);

返回:

blue
blue
red

2、在使用实例对象A中的属性prop时,首先看在该对象A中是否有名为"prop"的属性,如果没有则根据实例的[[Prototype]]属性在原型链上一级一级往上查原型、原型的原型……依此类推(当然我不清楚实践中会否有那么长的原型链,毕竟书上说实践中单独用的少),直到找到一个符合属性名"prop"的属性为止。

function GrandpaType() {}
GrandpaType.prototype.color = "red";

function FatherType() {}
FatherType.prototype = new GrandpaType();
FatherType.prototype.constructor = FatherType;
// FatherType.prototype.color = "green";

function SonType() {}
SonType.prototype = new FatherType();
SonType.prototype.constructor = SonType;
// SonType.prototype.color = "blue";

var colors = new SonType();
//colors.color = "black";
console.log(colors.color);

返回:

red

实际上就一种,就是你说的第一种。严格地说应该叫标识符解析(identifier resolution)

就是顺着你说的作用域链(实际是词法环境形成的链)查找的。

至于你说的第二种情况,应该叫做属性访问操作(Property Access),是顺着原型链查找的。

当然你把两种情况都看成对变量的搜寻也没有问题 :)

【热门文章】
【热门文章】