2017-05-25 32 views
-2

當我定義「汽車」象下面,爲什麼/當我使用「this」時javascript如何訪問局部變量?

var Car = function(m) { 
    var model = m; 
    function getModel() { 
     return model; 
    } 
    return { 
     getModel : getModel 
    } 
}; 

和我在這種情況下創建這樣var c1 = new Car("qwer");

一個對象,我無法訪問直接建模,僅通過關閉。

(console.log(c1.model); => undefined) 

(console.log (c1.getModel()); => qwer) 

,但是當我定義「汽車」像下面,

var Car = function(m) { 
    var model = m; 
    function getModel() { 
     return this.model; 
    } 
    return { 
     getModel : getModel 
    } 
}; 

,我在這種情況下創建的對象var c2 = new Car("asdg");

,我無法訪問直接建模, 而且還關閉。

(console.log(c2.model) => undefined) 

(console.log (c2.getModel() => undefined) 

你能告訴我爲什麼會發生這種情況嗎?

+0

因爲'this'指的是實例,並且沒有'model'實例變量......? 'model'是一個*局部變量*,基本上是私有的,而不是實例。同樣,從構造函數返回也不會做任何事情...... return語句被忽略,因爲構造函數不應該返回任何東西。 – Li357

+1

我敢肯定有一個帖子解釋'this'' –

+0

[here's one](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work/3127440#3127440) – Reyno

回答

-1

在你的第二種情況下,你有兩個不同的變量,一個是模型,第二個是this.modal,所以兩者都不同,因此這兩種方式都是未定義的。

您將值存儲在模型中,並顯示this.model的值。

1

在當你做第一種情況:

(console.log (c1.getModel()); => qwer) 

你得到 「QWER」 因爲getModel()函數可以從outer scope讀取變量model

但是,在第二種情況下,在行return this.model;,this被動態綁定到c2對象並且c2對象沒有model。所有的c2都有功能getModel()。您可以通過以下方式獲得所需的結果:

var Car = function(m) { 
 
    this.model = m; 
 
    this.getModel = function() { 
 
    return this.model; 
 
    } 
 
    //return { 
 
    // getModel: getModel 
 
    //} 
 
}; 
 
var c2 = new Car("asdg"); 
 
console.log(c2.getModel());

注意,即使上述方案不太理想,因爲功能最好應連接到構造函數的prototype對象。所以,我建議你稍微瀏覽一下堆棧溢出,你會得到更多的見解。

相關問題