[英]“this” context output not able to understand
我很難理解下面的代碼。
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var a = 4;
obj.foo();
setTimeout( obj.foo, 100 );
setTimeout( obj.foo.bind(obj), 100 );
它的輸出為2,4,4,我無法理解。
第一種情況,
obj.foo();
當this
內foo
將指向obj
,因為您已經分配的功能為特定對象的屬性。
第二種情況,
setTimeout( obj.foo, 100 );
在setTimeout中,傳遞的函數將在窗口的上下文中進行eval
。 所以這里var a = 4;
在窗口的上下文中執行並成為窗口的屬性。 當在函數foo
訪問this
時,這將指向此特定情況下的window
。
第三種情況,
setTimeout( obj.foo.bind(obj), 100 );
你只需綁定的obj
因為this
給函數foo
。 即使在窗口的上下文中評估函數,也不會更改綁定this
值。 這是bind
功能背后的規則。 所以this
不會從obj
變成window
。
this
關鍵字在差異上下文中的行為略有不同。
在全局執行上下文中(在任何函數之外),這指的是全局對象,無論是否處於嚴格模式。
在函數內部,其值取決於函數的調用方式。
function foo() {
console.log(this)
}
在非嚴格模式下, this
將默認為全局對象
在嚴格模式下, this
將默認為undefined
call
或apply
function foo() {
console.log(this)
}
var o = {'name': 'test object'};
foo.call(o) // log object `o`
this
可以使用call或apply方法綁定到調用中的特定對象。
bind
bind
方法返回一個函數,該函數使用特定對象通過bind
作為函數中的this
對象。
function foo() {
console.log(this)
}
var o = {'name': 'test object'};
bar = foo.bind(o)
bar() // log object `o`
有關更多信息,請參閱此鏈接: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this
在這種情況下obj.foo();
this
功能的foo
是obj
,所以this.a
參考obj.a
在這種情況下setTimeout( obj.foo, 100 );
obj.too
是函數foo
的引用。 setTimeout
將在全局上下文中執行它。
在這種情況下setTimeout( obj.foo.bind(obj), 100 );
, obj.foo.bind(obj)
返回到結合函數的引用this
與obj
。 setTimeout
將在obj
上下文中執行它
嘗試發出alert(this);
在foo()方法里面了解上下文。
obj.foo();
=>在對象上下文中運行,因此結果將是值a
內部obj
=> 2
setTimeout( obj.foo, 100 );
=>在窗口上下文中運行, var a = 4
在窗口上下文中, this.a
給出4( this
是window
)
並且最后一行將再次具有對象context => 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.