JavaScript中this值很讓人頭疼, 今天總結下幾個方法快速判斷this的指定.javascript
函數在new(new綁定)中調用: this綁定的是新建立的對象:java
var bar = new foo(); //this 指向bar.
函數經過call / apply(顯式綁定) 或者硬綁定調用, this指向括號內的對象:es6
var bar = foo.call(obj2); // this 指向 obj2
函數在某個上下文對象中調用(隱式綁定), this綁定該上下文對象:app
var bar = obj1.foo(); //this 綁定 obj1
若是上述三種都不是, 使用默認綁定. 在嚴格模式下 綁定到undefined, 不然綁定到全局對象:框架
var bar = foo(); //非嚴格模式下,this指向全局對象;
ES6中引入了箭頭函數, 解決了this的複雜性.mvvm
箭頭函數不是使用function關鍵字定義的, 而是使用"=>"操做符定義的.函數
箭頭函數不使用上文的四種標準規則, 而是根據外層(函數或全局)的做用域來決定this.this
function foo(){ //返回一個箭頭函數 return (a) => { //this繼承自 foo() console.log(this.a); }; } var obj1 = { a:2 }; var obj2 = { a:3 }; var bar = foo.call( obj1 ); bar.call( obj2 ); //2, 不是3
箭頭函數最經常使用於回調函數中, 例如事件處理器或定時器:es5
function foo(){ setTimeout() => { //這裏的this 在詞法上繼承自foo() console.log( this.a ); }, 100 ); }; foo.call( obj ); //2
function foo(){ //等價於上述代碼 var self = this; //ES6以前的模式 , self綁定外層函數. setTimeout( function(){ console.log( self.a ); //此時self的指向已經固定. }, 100 ); } var obj = { a = 2; }; foo.call(obj); //2
(The End)code