this是在定義的時候綁定,而不是執行函數的時候綁定,他的值是固定不變的。
在前幾種方法中,this的值是會發生變化的,但是在箭頭函數里面,他的this是被綁定的
-
綁定在他的副作用域,每一個執行的箭頭函數他本身是沒有this值的,箭頭函數的值繼承自外圍作用域,默認是類似這樣的結構_self=this。
var x=11; var obj={ x:22, say:()=>{ console.log(this.x)-11 console.log(this);-window // 為什么定義的時候this會指向全局呢?--在定義的時候x和say是屬于同級,所以定義say的時候綁定他的副父作用于是window }, _this:this, c:{ say:()=>{ console.log(this.x); 11 console.log(this._this)undefined console.log(x);11 //問題來了,箭頭函數怎么才能指向對象里面的屬性 } } }
-
使用舉例
var s1=10 function timer(){ this.s1=0; this.s2=0; setInterval(()=>{ console.log(this.s1); this.s1++; },1000)//this.s1會變大 setInterval(function(){ console.log(this.s1) this.s1++; },2000)//外面的s1會變大,但是如果輸出this.s2的話,第一次是undefined,之后會是NaN } var timer=new timer(); 使用1:箭頭函數可以讓setTimeout里面的this,綁定定義時所在的作用域,而不是指向運行時所在的作用域 使用2:利用this指向固定化的特性,封裝回調函數。