2016-02-24 46 views
0

我做這樣一個經典的JavaScript對象初始化,它就像一個魅力:爲什麼此對象初始化工作?

function Hero(a, n) {                
    this.nom = a;                 
    this.job = n;                 
    this.quiSuisJe = function() { 
     return "Mon nom est "+this.nom+" et je suis un "+this.job; 
    } 
}                     
var x = new Hero("Joe", "Ninja");             
var y = new Hero("Jinx", "Carry AD");            
console.log(x.quiSuisJe());              
console.log(y.quiSuisJe()); 

但是,如果我改變這樣的quiSuisJe功能:

function Hero(a, n) {                
    this.nom = a;                 
    this.job = n;                 
    this.quiSuisJe = function() { 
     return "Mon nom est "+a+" et je suis un "+n; 
    } 
}                     
var x = new Hero("Joe", "Ninja");             
var y = new Hero("Jinx", "Carry AD");            
console.log(x.quiSuisJe());              
console.log(y.quiSuisJe()); 

它的工作原理。爲什麼?

+5

關閉。內部函數是閉包,它可以訪問父函數變量。另請注意,內部函數是爲每個實例創建的。 – Tushar

+2

現在嘗試'x.nom =「qwerty」; X。 quiSuisJe();'看看會發生什麼。 – epascarello

回答

0

一個構造函數仍然是一個函數,所以既然你已經聲明瞭一個函數,你基本上會創建一個閉包。這意味着在這個新函數中你可以訪問頂層函數的屬性。當然,僅僅因爲你可以訪問它,並不意味着你應該像這樣使用它。嘗試使用this,而不是像第一個示例中那樣。

+0

非常感謝您的回答,但我仍然不知道爲什麼這些變量不會被銷燬。我明白爲什麼動態聲明的變量不會被銷燬(爲什麼它們不能),如果它們在後面的「內部」函數(變量範圍)中使用,但這裏的問題是它們是**而不是**聲明爲'var a =「blabla」,b =「blibli」;'但他們是*參數* ...我想我錯過了一些東西。 –

+0

你幾乎可以認爲參數是'var a ='blabla''放置在函數的最頂端。 – GMchris