浅谈JavaScript中的对象和类型(上)
2010-02-03 00:00:00 来源:WEB开发网很显然调用test的时候,window就是test的宿主对象。
理解了这一点,我们来看下面这段脚本:
function alarm()
{
this.a = window.alert;
test();
}
function test()
{
this.a("abc");
}
alarm();
a("hello world!");
怎么理解这一段代码?首先调用alarm函数,这个函数里面的this是什么?没错,是window。为什么?因为alarm调用的时候其实等同于 window.alarm,所以函数内的this就是window。然后this.a = window.alert,这等同于window.a = window.alert。然后执行test函数,同理,test函数里面的this也是window。整理后,其实整个代码可以解释成这样:
function alarm()
{
window.a = window.alert;
test();
}
function test()
{
window.a("abc");
}
window.alarm();
window.a("hello world!");
来看一个this不是window的情况:
var o = new Object(); //与var o = function() { };一样,都可以创建一个自定义对象,我们只需要一个对象,不必关心它是函数还是什么。
o.text = "hello object!"; //设置o的text成员
o.alarm = function()//定义一个函数,并设置为o的成员
{
window.alert(this.text); //注意这个this
}
alarm = o.alarm;
text = "hello world!";
alarm();
o.alarm();
猜一下执行结果吧。
值得注意的是,其实两个alarm是同一个函数,不同的是在调用上下文中,一个的宿主是window,一个的宿主是o,所以调用的结果不同。this所代表的对象,与函数本身没有任何关系,它取决于调用函数的上下文!
最后一个值得特别说明的东西是,函数的scope对象是不能用this捕获到的,考虑如下脚本:
text = "hello world!";
function test()
{
var text = "hello function!";
var a = function()
{
window.alert(this.text);
}
a();
}
test();
结果将是hello world!而不是hello function!,当然你可能会想,a的宿主应该是执行函数时的函数的scope对象,然后这个对象应该有个成员text。但事实并非如此,在这种情况下,a的宿主仍然是window。这一点可以理解为:函数的scope对象并不是一个真正的对象,它只是JavaScript运行时用来保存变量的东西。
这个现象,现在并没有特别好的办法去解释,当然,大家只需要记住,如果调用函数的时候,前面没有".",那么this就总会是window了。
Tags:JavaScript 对象 类型
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接