理解上下文对象是理解JS面向对象的基础。上下文对象是通过this变量体现的,这个变量永远指向当前代码所处的对象中,全局变量其实是window对象的属性。看一个上下文对象操作的简单的例子:
//*********************************************************
//在上下文对象内使用函数并将其上下文对象切换为另一个变量
//*********************************************************
var obj = {
yes: function(){
this.val = true;
},
no: function(){
this.val = false;
}
};
// 这个时候obj对象中没有val这个变量
alert( obj.val == null );
// 执行yes函数之后,val变量和obj对象联系起来
obj.yes();
alert( obj.val == true );
// 我们把window.no指向obj.no并执行
window.no = obj.no;
window.no();
// obj.val的值并没有变,而且window里有了val变量且值为false
// 因为window.no在执行的时候上下文是window
alert( obj.val == true );
alert(window.val == false);
但是我们在把obj.no的上下文对象切换为window时,代码变得不好理解了。JS提供了call和apply两个方法,可以用于实现这一功能。我们把上边的代码里的window.no = obj.no; window.no(); 替换成 obj.no.call(window);或者obj.no.apply(window);会得到同样的结果