每个执行环境都有一个与之关联的变量对象。虽然我们编写的代码无法访问这个对象,但是解析器会在后台使用它。
每个函数都有自己的执行环境。
(备注:综上所述,我们知道,函数、函数的执行环境、执行环境的变量对象是一一对应的关系。)
执行环境会创建变量对象的一个作用域链。
作用域链的用途,就是保证对执行环境有权访问的所有变量和函数的的有序访问。
作用域链的前端,始终是当前执行环境的变量对象。
如果这个环境是函数,则将其活动对象作为变量对象。
活动对象在最开始时只包含一个变量,即arguments对象。如果函数内定义了其他变量,则活动对象中会添加其它变量。
作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。
这样,一直延续到全局执行环境。
函数的执行环境开始时会先在自己的变量对象中搜索变量和函数名,如果搜索不到则再搜索上一级作用域链。
每个函数在被调用时都会自动取得两个特殊变量:this 和arguments。
内部函数在搜索这2个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这2个变量。
而对于其它变量,当其活动对象搜索不到时,会再搜索上一级作用域链。
摘自:《javascript高级程序设计》
(备注:当函数被调用时,活动对象会获得this对象)
(备注:对于this指针,只会搜索其执行对象的作用域。对于其它变量,当其活动对象搜索不到时,会再搜索上一级作用域链)
var x=3;
var a={
x:2,
b:{
x:1,
c:function(){return this.x;}}}
var c=a.b.c;
alert(c()); 返回3
alert(a.b.c()); 返回1
---------------------------------------------------------------------------
var myObject = {
foo:
"bar"
,
func: function() {
var self =
this
;
console.log(
this
.foo);
console.log(self.foo);
(function() {
console.log(
this
.foo);
console.log(self.foo);
}());
}
};
myObject.func();
程序的输出是什么?
bar bar undefined bar