this的指向在函數定義的時候是肯定不了的,只有函數執行的時候才能肯定this到底指向誰,實際上css
this的最終指向的是那個調用它的對象(這裏其實並不徹底對,this的指向有時候會很微妙,得靠本身去慢慢體會)數組
只有方法在對象上,對象調用當前方法,指向當前對象app
function fnThis(){ let user='js'; console.log(this.user)//undefined console.log(this)//global(window) } fnThis(); 這裏爲何會輸出一個全局的對象?由於咱們申明的函數,在全局裏,如今執行這個函數 其實是全局在調用 let obj={ user:'js', fn:function(){ console.log(this.user) } obj.fn(); 這裏是obj在調用,因此指向咱們的obj,這並不能說明,咱們一開始就說的this最終調用他的那個 對象 let obj={ user:'js', objTwo:{ user:'css', fn:function(){ console.log(this.user) } } } obj.objTwo.fn(); 這裏只是指向了obj2,而並無指向最終調用它的obj.
來個料咋們看看this這傢伙函數
實際上是這個點擊事件的匿名函數在調用,而這fn()自己是全局上下文的函數,它的this指向的是全局,它是做爲這個匿名函數的普通函數,天然指向的全局this
咱們若是這樣寫spa
let obj={ user:'js', objTwo:{ user:'css', fn:function(){ console.log(this.user) console.log(this) } } } let objThre=obj.objTwo.fn; objThree(); 把函數賦值給了objThree,而objThree是在全局上,因此輸出的是全局
let chinesePeople=function(){ this.name='張飛'; return obj } 若是返回的是對象,this就指向返回的那個對象,不然就指向實例對象
let obj={a:80} let objTwo={ a:70, fn:function(){ console.log(this.a); } } objTwo.fn.call(obj); 調用一個方法,並改變其this指向 objTwo.fn.apply(obj); 調用一個方法,並改變其this指向 前2者區別,在於後面的參數,一個是順序,一個是數組 objTwo.fn.bind(obj)(); bind()方法會建立一個新函數,在綁定後,咱們能夠加括號當即執行,也能夠等須要執行再執行 第一個參數對象,之後的順序傳參 new方法,實際上是隱藏的調用了一個call的方法