执行环境(execution context,有时也成为上下文,有时也称为”环境“)。执行环境定义了变量和函数有权访问那些数据,决定各自的行为。
全局执行环境是最外围的执行环境。全局执行环境一直都存在。宿主环境不同执行环境也不同。每一个环境都有一个执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。函数执行完后,栈将其环境弹出,把控制权返回给之前的执行环境。
当代码在一个环境中,会创建一个变量对象的一个作用域链(scope chain)。作用域的前端始终是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象,活动对象最开始时只包含一个变量,即arguments对象。作用域链中的下一个对象来自包含的环境,一次延续到执行的全局环境。全局执行环境的变量始终是作用域链中的最后一个对象。
标识符解析是沿着作用域链一级一级搜索标识符的过程。搜索过程始终是从作用域链的最前端开始。
函数的里面标识符从形参开始查询,其次在函数体里面的变量。搜索完后,到下一包含环境,逐次搜索环境(都是从形参开始搜索然后函数体的变量),直到全局环境。
var name ="Jaden";
function test(){
this.age = 15;
this.name = "bill";
this.getname = function(){
<span style="white-space:pre"> </span>var name = "jake";
<span style="white-space:pre"> </span>console.log(this.name);
<span style="white-space:pre"> </span>function my(name){ console.log(name, this.name); }
<span style="white-space:pre"> </span>setTimeOut(my,1000,"zhou");
my();
}
}
var t = new test();
t.getname();
var a = t.getname;
a();
output: bill
undefined Jaden
Jaden
undefined Jaden
zhou Jaden
zhou Jaden
验证了标识符解析的。
得出的规则:this除new 和字面对象中外表示的都是window
在new的构造函数把this看成一个隐式变量。
new的构造函数是有生命周期的(undefined Jaden是对象‘’生命周期“的体现)