变量搜寻 - 在JavaScript中浏览器(或者其他宿主环境)对变量的搜寻有哪些方式?
怪我咯
怪我咯 2017-04-10 16:54:40
[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
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
天蓬老师

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号