javascript中的this

this 既不指向函數自身也不指向函數的詞法做用域,this 其實是在函數被調用時發生的綁定,它指向什麼徹底取決於函數在哪裏被調用。javascript

1. 由new 調用?綁定到新建立的對象。
2. 由call 或者apply(或者bind)調用?綁定到指定的對象。
3. 由上下文對象調用?綁定到那個上下文對象。
4. 默認:在嚴格模式下綁定到undefined,不然綁定到全局對象。java

必定要注意,有些調用可能在無心中使用默認綁定規則。若是想「更安全」地忽略this 綁
定,你可使用一個DMZ 對象,好比$ = Object.create(null),以保護全局對象。安全

ES6 中的箭頭函數並不會使用四條標準的綁定規則,而是根據外層(函數或者全局)做用域(當前的詞法做用域)來決定
this,具體來講,箭頭函數會繼承外層函數調用的this 綁定(不管this 綁定到什麼)。這其實和ES6 以前代碼中的self = this 機制同樣。app

常見的隱式調用丟失this的例子:函數

function foo() {
console.log( this.a );
}
function doFoo(fn) {
// fn 其實引用的是foo
fn(); // <-- 調用位置!
}
var obj = {
a: 2,
foo: foo
};
var a = "oops, global"; // a 是全局對象的屬性
doFoo( obj.foo ); // "oops, global"

  

參數傳遞就是一種隱式賦值,所以咱們傳入函數時也會被隱式賦值。oop

JavaScript 環境中內置的setTimeout() 函數實現和下面的僞代碼相似:
回調函數丟失this 綁定(除非硬綁定了this,不然回調函數丟失this是常見的)this

function setTimeout(fn,delay) {
// 等待delay 毫秒
fn(); // <-- 調用位置!
}

  

function foo() {
console.log( this.a );
}
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); // 3
(p.foo = o.foo)();

賦值表達式p.foo = o.foo 的返回值是目標函數的引用,所以調用位置是foo() 而不是spa

p.foo() 或者o.foo()。根據咱們以前說過的,這裏會應用默認綁定。對象

相關文章
相關標籤/搜索