簡體   English   中英

遮蔽`this`-詞匯名稱解析

[英]Shadowing `this` - lexical name resolution

編輯:我認為這不是重復的; 它是一個隱藏參數,我想詢問有關this陰影以及詞法作用域,請閱讀此SO Q / A re。 陰影。

我原以為這個名字的意思this可能是一種動態的(在范圍界定方面)得到解決,這樣才能解釋為什么它不是在我看來,不被詞法解決:

function foo() {return this;}
var a = {f: foo};
var b = {f: foo};

a.f() !== b.f();
a.f() !== foo();
a.f() !== window; //not strict mode

但是后來我讀到,每個函數都無提示地this作為附加參數接收。 (我意識到箭頭功能是不同的。)

顯然helper()不能像我們希望的那樣工作:

ob = {
  meth: function(){
    var helper = function() {return this;};
    return helper();
  }
};
ob.meth(); //Window or undefined

據我了解,不是通過查看封閉范圍來解決this問題(結果是ob ),而是解釋器正在調用helper()並將this設置為undefined (嚴格模式),並作為參數靜默傳遞。

因此,在圍繞范圍是this有效的被遮蔽 ,因此詞法作用域其實是在行動?

你是對的。 除了在箭頭的功能的情況下, this是從來沒有詞法解決。 它始終是指以下之一:

  1. 調用函數的對象,例如valueOfThis.foo()
  2. applycall的第一個參數,例如foo.apply(valueOfThis, params)foo.call(valueOfThis, ...)
  3. 對於事件處理程序,例如<button onclick="alert(this.tagName.toLowerCase());"/>
  4. 當函數用作構造Foo = function(){ ... }; new Foo()例如Foo = function(){ ... }; new Foo() ,正在構造的對象Foo = function(){ ... }; new Foo() Foo = function(){ ... }; new Foo()
  5. 如果函數是使用bind創建的,則綁定到函數的對象,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo() bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
  6. 在getter / setter中, this是指正在為其訪問或設置屬性的對象,例如valueOfThis.someProperty = 123
  7. window (通常),如果沒有上述情況,例如foo()

@Bergi在下面的評論中為所有這些內容提供了很好的參考

對於綁定函數 ,被調用的函數實際上是與傳遞給bind方法不同的函數,因為bind方法會創建一個新函數

那么周圍范圍的作用是否被有效地掩蓋了,因此詞匯作用域實際上在起作用嗎?

是的,可以從這種角度看待它。 綁定到helper作用域的this遮蔽了綁定到meth范圍的那個。 (如果您使用過箭頭功能,則不會)。

但是,您仍然需要記住, this不是普通變量,而是特殊關鍵字。 它僅綁定到函數作用域,不可寫,在草率模式下具有怪異的強制對象語義,並且始終隱式綁定-如您所說,是一個隱藏參數。

除非您試圖了解this在箭頭函數(及其詞法解決方案)中的工作方式,否則對范圍和陰影的類比是毫無用處的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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