[英]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
是從來沒有詞法解決。 它始終是指以下之一:
valueOfThis.foo()
apply
或call
的第一個參數,例如foo.apply(valueOfThis, params)
或foo.call(valueOfThis, ...)
。 <button onclick="alert(this.tagName.toLowerCase());"/>
Foo = function(){ ... }; new Foo()
例如Foo = function(){ ... }; new Foo()
,正在構造的對象Foo = function(){ ... }; new Foo()
Foo = function(){ ... }; new Foo()
bind
創建的,則綁定到函數的對象,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
this
是指正在為其訪問或設置屬性的對象,例如valueOfThis.someProperty = 123
window
(通常),如果沒有上述情況,例如foo()
@Bergi在下面的評論中為所有這些內容提供了很好的參考 。
對於綁定函數 ,被調用的函數實際上是與傳遞給bind
方法不同的函數,因為bind
方法會創建一個新函數
那么周圍范圍的作用是否被有效地掩蓋了,因此詞匯作用域實際上在起作用嗎?
是的,可以從這種角度看待它。 綁定到helper
作用域的this
遮蔽了綁定到meth
范圍的那個。 (如果您使用過箭頭功能,則不會)。
但是,您仍然需要記住, this
不是普通變量,而是特殊關鍵字。 它僅綁定到函數作用域,不可寫,在草率模式下具有怪異的強制對象語義,並且始終隱式綁定-如您所說,是一個隱藏參數。
除非您試圖了解this
在箭頭函數(及其詞法解決方案)中的工作方式,否則對范圍和陰影的類比是毫無用處的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.