专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > JavaScript

请问解释下面javascript代码中this的用法

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
请教解释下面javascript代码中this的用法
代码如下:
var aa=11;    
Test();    
alert(aa);   
  
function Test()    
{    
  var aa=33;    
  alert(this.aa);   
  this.aa = 22;    
  alert(this.aa);   
  alert(aa);   


在浏览器中运行的顺序为11,22,33,22,undefined,22,33,22

先说我的理解,第一条语句之后就跳到Test()函数里面了,然后第一个alert(this.aa)里面的this.aa因为没有用new实例化所以this指向默认的顶层对象window,即this.aa=11;
接着this.aa=22;
然后alert(aa)这里的aa自然就是函数里面定义的aa——33。所以此时的顺序为11,22,33。
Test()函数执行完之后,执行alert(aa);这条语句,此时aa的值为22,所以我认为这个值仍是上次this.aa的值——22(这里如有错请指出,而且这里也是我不理解的地方)。

然后就到最后一句alert(new Test().aa),我的理解是alert(new Test().aa)可拆解为
var test=new Test(); //因为执行new Test()会返回一个新的对象,还没给在个this所指对象添加aa属性时alert(this.aa)是undefined
alert(test.aa);

function Test(){
var aa=33;
alert(this.aa); //这时候this指向test对象,此时test对象上没有aa所有是undefined
this.aa=22; //new 完Test对象后,this就指向那个对象。即是test,给test增加一个aa
alert(this.aa); //所以这时候是test.aa为22
alert(aa); //这时候aa是指向当前函数内的aa,所以是33
}

最后再回去看alert(test.aa);问题就来了,为什么此时test.aa为22?

------解决思路----------------------
后半段代码貌似没copy上来。“Test()函数执行完之后,执行alert(aa);这条语句,此时aa的值为22,所以我认为这个值仍是上次this.aa的值——22(这里如有错请指出,而且这里也是我不理解的地方)。”--这个打印为22是因为,当Test当做函数来执行时,上下文为全局对象。所以在Test中使用this定义的变量成为了全局变量。所以我们在Testt外面直接使用变量名访问aa的值。
------解决思路----------------------
1.Test属于window,所以第一个this是window this.aa是11
2.同理 window下的aa赋值22 this.aa是22
3.aa是在函数体内声明的,所以 输出33
4.window下的aa第二步的时候变成了22 在函数体外引用aa是引用的window下的全局变量aa 所以 输出22
5.new 的时候,实际上相当于实例化Test,这时候this应该是指向Test,按照代码来看应该输出33,但是这种实例化有点类似单例模式的实例化,Test中的aa在这种情况下并不以属性是形式存在,所以this.aa引用不到aa这个属性 输出undefined
6.虽然第5步的aa没有引用到,在是函数值主动给this.aa属性进行了赋值,所以第六步可以引用 输出22
7.在5中已经说到aa是不以属性的形式存在的,但是却是以变量形式存在的,所以这里引用aa,是使用的局部变量aa 输出33
8.不用说了跟6中一样 引用的是Test的属性aa 输出22
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: