1、this使用方法:
this指的是當前函數的對象。通過下面的demo簡單說明一下:
function doSomething(){
alert(this);
}
doSomething();
我是在firefox裡面調試的,所以返回的結果是[Object Window]。
那麼這個 [Object Window], 到底是什麼呢?看看下面的代碼
function doSomething(){
alert(this===window);
}
doSomething();
看到彈出了true, 也就是說在這種正常情況下,this其實就是window
所以,我們定義了一個全域的變數的時候,可以
var test="Tony";
也可以
window["test"]="Tony";
下面這個例子,進一步說明,正常情況下,函數裡的this就是window
var test="Tony";
function doSomething(){
alert(this.test); //彈出 "Tony";
alert(window.test); //彈出 "Tony";
}
doSomething();
通過以上demo,我們可以看出this是指doSomething()所在的對象。即this.test=windo.test;
2、閉包中的this
(function(window){
var name ="The Window"; //建立了一個全域變數name
var object = { //又建立了一個對象(建立對象的方法有很多種)
name:"My Object", //建立了一個name屬性(屬性就是引用非函數)
doSomething:function(){ //建立了一個doSomething方法(方法就是引用了函數)
return function(){ //這個doSomething方法返回一個匿名函數
return this.name;
//這個匿名函數又返回this.name
};
}
};
alert(object.doSomething()()); //由於這個doSomething方法返回的一個函數,所以這樣就可以調用這個函數了
})(window)
這段代碼返回的結果是"The Window",而不是我所預期的"My Object",前面不是說了嗎?this指的是當前函數的對象, 可是在這裡為什麼就不是呢?其實就是因為閉包的特性,由於這個匿名函數構成了一個閉包,所以他所儲存的就是整個變數對象也就是Window對象。
那麼如何做才能讓結果返回"My Object"呢?還是那句話this指的是當前函數的對象,那麼問題就簡單了,也就是讓this放在doSomething方法裡,而不是那個匿名函數裡不就可以了嗎?修改代碼如下:
var name ="The Window";
var object = {
name:"My Object",
doSomething:function(){
var abc = this ;
return function(){
return abc.name;
};
}
};
alert(object.doSomething()());
現在再看代碼紅色部分做的修改,this是不是指的是當前doSomething()函數的object對象了?那再輸出結果自然就是"My Object"了