![](/img/trans.png)
[英]Javascript: why “this” inside the private function refers to the global scope?
[英]Why `this` refers to the parent function's scope
我確實讀過this
關鍵字可以引用全局范圍,也可以引用它所引用的對象或引用事件的對象,但不理解以下行為。
function outer() { var inner = 4; function innerFunc() { var inner = 5; console.log('inner called with ' + this.inner); } return innerFunc; } var obj = outer(); obj();
為什么這個日志4而不是5.AFAIK this
應該引用它所引用的函數,並且應該通過closure
來獲得。
TL; DR - this
不會像您認為的那樣有效。
函數的this
(也稱為上下文)是在調用時確定的,而不是在函數定義時確定的。 眾所周知, this
是動態綁定的 ,而閉包的變量是詞法綁定的 。
var obj = outer();
obj();
使用this = window
調用outer
(或者在Node.js的情況下調用global
),因為您沒有處於嚴格模式(否則, this = undefined
)。 outer
不使用this
,所以這不會對它產生太大影響。
outer
然后返回一個函數( innerFunc
),並將它分配給obj
。 然后,再次使用this = window
調用obj
(因為您沒有使用.bind()
.call()
或.apply()
或.apply()
指定其他內容)。
然后記錄this.inner
,它等同於window.inner
,它是undefined
除非你碰巧有一個名為inner
的全局變量帶有一些值。
的值this
,然后,由呼叫者決定。
如果你像這樣調用了obj
:
obj.call({inner: 42}); // first argument to fn.call() is the context
無論函數是如何定義的,您都會在控制台中看到42。
您的代碼片段返回undefined
,而不是4.原因是因為window
通過調用obj()
調用innerFunc
。 因此, this
是指window
因為它被稱為innerFunc
(並且window.inner
undefined
)。 您可以通過在代碼頂部添加變量inner = 3
來看到這一點(這將使window.inner = 3
),因此您的函數將記錄3
。
inner = 3; // ie: window.inner = 3 function outer() { var inner = 4; function innerFunc() { var inner = 5; console.log('inner called with ' + this.inner); // this is window } return innerFunc; } var obj = outer(); obj();
在此示例中,您使用的是函數而不是對象 。 此外,您使用變量而不是this
關鍵字來分配值。 我認為你所考慮的概念是local scoping
例如,
function parent(){
var n = 5
function child(){
var n = 4 //n is 4 here
}
//n is 5 here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.