![](/img/trans.png)
[英]Accessing variables inside the function, initialized using “this” keyword
[英]accessing global property using “this” keyword inside a function
我知道在javascript中,當你在函數中使用"this"
關鍵字時,那么"this"
將根據Quirksmode網站引用該函數的“所有者”。 因此,當我們有一個函數並且我們在其中使用"this"
時,那么"this"
指的是全局(窗口)對象。
我對"this"
如何工作有點困惑,例如在下面的代碼中, "this"
然后應該能夠解析x
因為x
幾乎是全局對象的屬性(在本例中是窗口)。 但是在這種情況下, this.x
警告"undefined"
而不是x
值。
var x = "Global";
function foo(){
alert(this.x); //undefined
};
foo();
然后我嘗試了其他一些事情:
function bar(){
function foo(){
alert(this); //[Object DOMWindow]
};
foo();
};
bar();
如果我的理解是正確的,那么'this'
應該在第二種情況下引用bar()
,因為它是foo()
的所有者,但為什么它仍然引用全局對象?
有人可以解釋關於“this”關鍵字的正確理論是什么?
你有錯誤的結局。 值this
取決於該函數的調用 ,它不是如何定義的。
window.foo()
然后(在foo內) this
將是window
bar.foo()
那么this
將是bar
(雖然你需要復制foo
所以它首先是bar
的屬性) baz.bar.foo()
那么this
將是bar
(你只能通過this
獲得父對象) foo.call(bar)
那么this
也是bar
因為call
可以覆蓋this
new foo()
那么this
將是正在創建的新對象 默認對象是window
,所以如果你只調用foo()
那么它與window.foo()
相同。
函數定義的范圍無關緊要。
總結你的問題,你問為什么在你的第一個片段中, this.x
是undefined
:
var x = "Global";
function foo(){
alert(this.x); //undefined
}
foo();
它完全沒有意義, this
值應該引用全局對象 - 如果你的代碼處於嚴格模式,你會得到一個TypeError
,因為this
本身就是undefined
- 。
我認為this.x
可能undefined
的唯一方法是x
的變量聲明是在函數內完成的。
檢查以下兩個示例: 1和2 ,它們完全相同,不同之處在於第二個,代碼包含在onload
事件處理程序中,因此x
變量在全局范圍內不存在( window.x
undefined
)...
是的, this
始終是正在執行的函數的所有者和關於這個問題的最佳答案是比你曾經想知道this
var x = "Global";
function foo(){
alert(this.x); // alerts "Global" for me
};
至於bar()
它是一個獨立的功能, this
在上面鏈接的答案,這是你的情況描述將被綁定到“全局”對象DOMWindow
如果您真的想了解this
工作原理,請閱讀10.3 Execution Context
及以后的ECMAscript 262規范 。
以下是第10.4.3節中的內容:
10.4.3輸入功能代碼
當控件進入函數對象F中包含的函數代碼的執行上下文,調用者提供thisArg和調用者提供的argumentsList時,執行以下步驟:
如果函數代碼是嚴格代碼,請將ThisBinding設置為thisArg。
否則,如果thisArg為null或未定義,則將ThisBinding設置為全局對象。
否則,如果Type(thisArg)不是Object,則將ThisBinding設置為ToObject(thisArg)。
否則將ThisBinding設置為thisArg。
設localEnv是調用NewDeclarativeEnvironment的結果,將F的[[Scope]]內部屬性的值作為參數傳遞。
將LexicalEnvironment設置為localEnv。
將VariableEnvironment設置為localEnv。
設代碼為F的[[Code]]內部屬性的值。
使用功能代碼和argumentsList執行聲明綁定實例化,如10.5中所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.