2015-07-28 45 views
1

我最近開始學習JavaScript,同時做一些實驗用的代碼停留在此代碼:瞭解內部函數在Javascript

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + this.ab) 
     }()) 
    } 
}; 
k.func(); 

此代碼給我結果「inner1喜」和「inner2未定義」。

我不明白爲什麼它的undefined在第二個console.log

+2

函數內部(..()),被稱爲IIFE,具有窗口環境(這一點),但你並沒有在窗口對象定義AB – Evgeniy

回答

7

函數的this在您調用時會被綁定,具體取決於您如何調用它。將其稱爲值而不是屬性 - (expression)()而不是object.method() - 將導致在嚴格模式下將this設置爲全局對象或undefined

函數對象有兩種方法調用帶明確指定的函數thiscallapply。你可以在這裏使用前者。

(function() { 
    console.log("inner2 " + this.ab); 
}.call(this));

,它將推動調用函數的this到內部功能。

或者,您可以將this分配給一個變量。

var that = this; 

(function() { 
    console.log("inner2 " + that.ab); 
}());
+0

感謝的答案,這是真的很有幫助。 –

2
var k = { 
    ab: "hi", 
    func: function() { 
     console.log(this,"inner1" + this.ab); 
     (function() { 
      console.log(this,"inner2 " + this.ab) 
     }()) 
    } 
}; 
k.func(); 

執行匿名函數改變情況下,堅持上下文做:

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + this.ab) 
     }.bind(this).call()) 
    } 
}; 
k.func(); 
+0

不傳遞任何東西來調用有點多餘;你可以做'.bind(this)()'。 (如果是爲了清楚起見...也許將它分配給某些東西) – Ryan

+0

@minitech我每天都會學到新的東西 – Isaac

1

您不必在第二個功能使用this任何引用。相反,您可以使用:

(function() { 
    console.log("inner2 " + this.ab) 
}.call(this)) 
2

@minitech和@Issac很好地解釋了問題和解決方案。另一種在任何層面獲得財產的方法都是客觀的。在你的代碼是:

var k = { 
    ab: "hi", 
    func: function() { 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + k.ab) 
     }()) 
    } 
}; 

k.func(); 
1

在你的榜樣「這」指基於範圍兩回事。你可以玩這個示例代碼。也許它會幫助你理解基礎知識。

var k = { 
    ab: "hi", 
    func: function() { 
     var me = this; // save 'meaning of this' in variable me. 
     console.log("inner1" + this.ab); 
     (function() { 
      console.log("inner2 " + me.ab) 
     }()) 
    } 
}; 
k.func();