JavaScript面向对象的支持(下)
2010-09-14 13:37:33 来源:WEB开发网我们发现setValue()的确可以访问到位于MyFoo()函数内部的"局部变量i",但是由于setValue()方法的执有者是MyFoo对象(记住函数也是对象),因此MyFoo对象拥有MyFoo()函数的唯一一份"上下文环境".
接下来MyFoo.setValue.call()调用虽然为setValue()传入了新的this对象,但实际上拥有"上下文环境"的仍旧是MyFoo对象.因此我们看到无论创建多少个obj1/obj2,最终操作的都是同一个私有变量i.
全局函数/变量的"上下文环境"持有者为window,因此下面的代码说明了"为什么全局变量能被任意的对象和函数访问":
//---------------------------------------------------------
// 全局函数的上下文
//---------------------------------------------------------
/*
function Window() {
*/
var global_i = 0;
var global_j = 1;
function foo_0() {
}
function foo_1() {
}
/*
}
window = new Window();
*/
因此我们可以看到foo_0()与foo_1()能同时访问global_i和global_j。接下来的推论是,上下文环境决定了变量的“全局”与“私有”。而不是反过来通过变量的私有与全局来讨论上下文环境问题。更进一步的推论是:JavaScript中的全局变量与函数,本质上是window对象的私有变量与方法。而这个上下文环境块,位于所有(window对象内部的)对象实例的上下文环境链表的顶端,因此都可能访问到。用“上下文环境”的理论,你可以顺利地解释在本小节中,有关变量的“全局/局部”作用域的问题,以及有关对象方法的封装权限问题。事实上,在实现JavaScript的C源代码中,这个“上下文环境”被叫做“JSContext”,并作为函数/方法的第一个参数传入。
Tags:JavaScript 面向 对象
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接