簡體   English   中英

調用函數和創建函數實例之間的Javascript區別

[英]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可以在一個函數的調用進行設置:

  1. 如果通過new運算符調用該函數,那么this將引用新創建的對象。
  2. 如果通過對象的屬性查找( foo.someFunction() )獲得對函數的引用,那么this將是對該對象的引用。
  3. 如果函數是通過函數原型中的.apply() .call().apply()調用的,那么this將引用使用這些函數中的任何一個的第一個參數,必要時強制轉換為對象值。
  4. 如果通過簡單的“裸”引用調用該函數,那么this將引用全局上下文(瀏覽器中的window )。 編輯 - ŠimeVidas在上面的評論中指出,在嚴格模式下,這種情況導致thisnull (這實際上更有意義,並且將避免在OP中觀察到的怪異)。

有4種方法在JavaScript中使用的函數每個這些確實是什么改變了什么內容this就是:

  • 函數調用:this =全局對象(瀏覽器中的窗口)
  • 方法調用:this =從中調用它的對象。
  • 構造函數調用:this =您正在創建的新對象。
  • 呼叫/應用呼叫:此=您傳遞的對象。

在你的情況下, this == window直接調用函數( outer() ),但如果你使用new( new outer() )調用,那么它將是你正在創建的新對象。

基本上我在這里寫的

暫無
暫無

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

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