簡體   English   中英

為什么`this`指的是父函數的范圍

[英]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。

一種方法來緩解這個並保留控制你this是要么使用fn.bind()箭頭功能

您的代碼片段返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM