代码如下:
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