[英]Javascript difference between calling a function and creating an instance of a function
我試圖理解為什么內部函數可以在直接調用外部函數時訪問外部函數的公共屬性,而不是在將其賦值給變量時?
例:
function outer(x,y){
this.x = x;
this.y = y;
function inner(){
alert(this.x);
}
inner();
}
outer(1,2); //As expected, alerts 1
var func = outer(1,2) //Also alert 1
var func2 = new outer(1,2); //Alerts undefined
我試過的一件事是從alert(this.x);
刪除this
關鍵字alert(this.x);
它確實適用於所有三個案例。 但是,如果我刪除了this
關鍵字,我將訪問傳入的參數,而不是公共變量,這絕對不是所需的操作。 有人可以解釋這種行為嗎?
當你像這樣調用outer(1, 2)
, this
是對window
的引用,所以“x”和“y”實際上是全局變量。 這就是為什么inner()
可以訪問“x”。
當你調用new outer(1, 2)
你已經導致this
(在“outer”中)成為對新對象的引用。 當在“外部”內部調用“內部”時, this
仍將引用window
,因此沒有“x”。
為每個函數調用確定此值, this
值僅取決於該調用的詳細信息。 因此,通過new
調用“outer”這一事實對內部調用“inner”沒有影響 - 因為你只需將函數稱為inner();
, this
函數內部的值將是對window
的引用(好吧,全局上下文,無論是什么)。
以下是如何this
可以在一個函數的調用進行設置:
new
運算符調用該函數,那么this
將引用新創建的對象。 foo.someFunction()
)獲得對函數的引用,那么this
將是對該對象的引用。 .apply()
.call()
或.apply()
調用的,那么this
將引用使用這些函數中的任何一個的第一個參數,必要時強制轉換為對象值。 this
將引用全局上下文(瀏覽器中的window
)。 編輯 - ŠimeVidas在上面的評論中指出,在嚴格模式下,這種情況導致this
為null
(這實際上更有意義,並且將避免在OP中觀察到的怪異)。 有4種方法在JavaScript中使用的函數每個這些確實是什么改變了什么內容this
就是:
在你的情況下, this == window
直接調用函數( outer()
),但如果你使用new( new outer()
)調用,那么它將是你正在創建的新對象。
基本上我在這里寫的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.