javascript中,咱們預想的this指向,有時候與預期不同,直接上經典例子javascript
window.name=2; var test={ 'name':1, 'getName':function(){ console.log(this.name);//輸出1 return function(){ console.log(this.name);//輸出2 } } } test.getName()();
上面爲最經典的一個this指向解析案例,第一個this指向test對象,第二個this指向window全局對象,第一個console運行的是test對象裏面的方法 ,第二個console運行的是一個匿名函數(也能夠稱爲普通函數)在JavaScript中普通函數的this指向的是全局對象的,上面字面量的建立test對象隱含着new關鍵詞,整個test是一個新的對象,getName屬於test裏面的方法,this會指向test對象,而getName裏面return的函數,屬於一個普通函數,這個函數裏的this會指向window全局,java
ps:其實還能夠用閉包的解析,我我的以爲若是這個沒弄明白,再提閉包會讓人更加迷惘。閉包
假設你想把第二對象指向test,能夠使用call在調用時候改變app
window.name=2; var test={ 'name':1, 'getName':function(){ console.log(this.name); return function(){ console.log(this.name); } } } test.getName().call(test); //輸出1,1 test.getName().apply(test); //輸出1,1
還有一個改變this對象的方法,在test裏面的方法嵌套函數以前,先把test對象(指向test的this)用變量的方式保存下來,下面的案例代碼函數
window.name=2; var test={ 'name':1, 'getName':function(){ var that=this;//預先把指向test的this保存到that變量中 console.log(this.name);//輸出1 return function(){ console.log(that.name);//輸出1 } } } test.getName()();