WEB开发网
开发学院网页设计JavaScript 浅谈JavaScript中的对象和类型(上) 阅读

浅谈JavaScript中的对象和类型(上)

 2010-02-03 00:00:00 来源:WEB开发网   
核心提示: 很显然调用test的时候,window就是test的宿主对象,浅谈JavaScript中的对象和类型(上)(4),理解了这一点,我们来看下面这段脚本:functionalarm(){this.a=window.alert;test();}functiontest(){this.a("a

很显然调用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了。

上一页  1 2 3 4 

Tags:JavaScript 对象 类型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接