一个function, 从语法的角度讲,既可以使用括号让其执行,也可以new它,比如
fucntion a(){}
var b = a();
var c = new a();
对 于c来说,a方法同样会执行,需要注意的是,如果a方法有return语句,那么b和c的值都是这个被return的东西;如果a方法根本没有任何 reutrn,那么b的值是undefined,对于c来说,a方法等同于最后会被默认加上一个retrun this,所以c会拿到一个对象。
再看另一个方法,
function a() {
console.log(this);
this.prototype.test = function(){
console.log(this);
}
this.id=1;
}
如果直接用a()来运行它,等价于window.a();所以打印出来的this就是window,this.id也会给window添加一个id属性并赋值;prototype的那三行会给window对象添加一个叫做test的方法。
如果用var b = new a()来运行它,new会产生一个新的this,所以打印出来的就是一个空的a对象;
b.test()会让test方法执行,打印的是一个带有test方法的a对象。
---------------------------------------------------------
需要额外注意的是,JS在需要定义callback方法的时候,callback方法默认的执行域是window,所以callback中的this就是window。如果还想使用callback定义的时候的作用于,就要用一个变量来寄存当时的this,比如:
function a() {
this.test = function(){
var me = this;
setTimeout(function(){
console.log(me);
},1000);
}
}