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

区黑 2015-07-12 10:05:32
代码如下:
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?
...全文
125 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010892827 2015-07-16
  • 打赏
  • 举报
回复

//1.函数调用模式的时候,this指向window

function aa(){
  console.log(this)
}
aa()                 //window
//2.方法调用模式的时候,this指向方法所在的对象

var a={};
a.name = 'hello';
a.getName = function(){
  console.log(this.name)
}
a.getName()         //'hello'
//3.构造函数模式的时候,this指向新生成的实例

function Aaa(name){
  this.name= name;
  this.getName=function(){
    console.log(this.name)
  }
}
var a = new Aaa('kitty');
a.getName()        //  'kitty'
var b = new Aaa('bobo');
b.getName()        //  'bobo'
//4.apply/call调用模式的时候,this指向apply/call方法中的第一个参数

var list1 = {name:'andy'}
var list2 = {name:'peter'}

function d(){
  console.log(this.name)
}
d.call(list1)     //  'andy' 
d.call(list2)     //  'peter' 

chanel_1 2015-07-13
  • 打赏
  • 举报
回复
后半段代码貌似没copy上来。“Test()函数执行完之后,执行alert(aa);这条语句,此时aa的值为22,所以我认为这个值仍是上次this.aa的值——22(这里如有错请指出,而且这里也是我不理解的地方)。”--这个打印为22是因为,当Test当做函数来执行时,上下文为全局对象。所以在Test中使用this定义的变量成为了全局变量。所以我们在Testt外面直接使用变量名访问aa的值。
KK3K2005 2015-07-13
  • 打赏
  • 举报
回复
因为 this.aa = 22;
jiangbai333 2015-07-13
  • 打赏
  • 举报
回复
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
区黑 2015-07-13
  • 打赏
  • 举报
回复
引用 2 楼 qq_19965967 的回复:
后半段代码貌似没copy上来。“Test()函数执行完之后,执行alert(aa);这条语句,此时aa的值为22,所以我认为这个值仍是上次this.aa的值——22(这里如有错请指出,而且这里也是我不理解的地方)。”--这个打印为22是因为,当Test当做函数来执行时,上下文为全局对象。所以在Test中使用this定义的变量成为了全局变量。所以我们在Testt外面直接使用变量名访问aa的值。
代码贴漏了,完整的如下
var aa=11;    
Test();    
alert(aa);   

function Test()    
{    
  var aa=33;    
  alert(this.aa);   
  this.aa = 22;    
  alert(this.aa);   
  alert(aa);   
}    
 
alert(new Test().aa);
所以最后弹出的22是为什么呢?

87,888

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧