一直以來,對this的討論都是熱門話題。有人說掌握了this就掌握了JavaScript的80%,說法有點夸張,但可見this的重要性。至今記錄了很多關于this的零碎筆記,今天就來個小結。
本人看過對this解釋的最簡單的說法:誰調用這個函數,this指向誰。 好啦,就是這么簡單。下面再來具體說一下,請隨時用這個說法去驗證。
先來看一道js面試題熱熱身:

var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo
obj.foo() // objbar() // window
obj.foo()套用“誰調用指向誰”的說法就很好理解了,但bar()為啥是window。其實,這個也是可以套用這個簡單的說法。前面我們var了一個變量bar,請注意,這個bar是個全局變量,即bar===window.bar,并把函數obj.foo賦給bar,此時直接調用bar(),就等于window.bar()。這樣就好理解了,這個函數就是window調用的,沒毛病了。關于這道題的解釋,也可以參考這篇文章:http://mp.weixin.qq.com/s/ksqtCd8ouxU-cVc_HnA4Aw
牢記這句話:“誰調用指向誰”,搞清誰調用的,解決大部分的this問題足夠了。下面說幾個this的特殊情況:
1、函數被具體對象調用時,指向直接調用者。如果這個函數里面嵌套有函數,里面函數的this不會指向這個調用者,可通過that=this改變指向。內部函數用that調用該對象屬性。

var name="out";var obj={
name:"in",
outFoo:function(){ var that=this;//將this賦給that,內部函數的that指向obj
function inFoo(){ this.name; // out,此時this指向window
that.name; // in,此時that指向obj }
},
};
2、如果函數通過new調用,那么就會創建一個對象,并且this 指向新創建的對象。

function Foo(){ //var this=new Object();函數內部隱式默認創建this對象并返回this
this.name="foo"; //return this;}var obj=new Foo(); //將返回的this賦給objconsole.log(obj.name);// foo
3、setTimeOut、setInterval函數中的this指向window。
4、通過apply或call調用時,this會動態改變它的指向。這倆種方法都接受倆個參數,第一個都是調用這個函數的對象。用法:functionNmae.apply(調用的對象,參數2)。
5、通過bind()調用時,這個與前面兩個用法差不多,只不過bind()靜態綁定this,一旦綁定了就不會改變,即使用call或apply也沒用,同時返回一個函數體待執行
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。