2016-11-22 122 views
0

剛開始認真對待JavaScript。我的代碼在下面有什麼問題?揭示模塊模式得到未定義變量

var Person = (function(name,age){ 
    var name = name, age = age; 
    var print = function(){ 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
    } 

    return {print:print} 
})(); 

Person.print("James",19); 

我得到的名字和年齡未定義。我問題我發現也與這種模式,如果你有很多方法,那麼最後你的回報將是

return {methodA:methodA, methodB:methodB, methodC:methodC}這對我來說是如此醜陋。我是不是應該換我的方法的返回內像

return{ 
    methodA: function(){ 

    } 
}; 
+1

沒有問題的,但要注意的是,線'變量名稱=名字,年齡=年齡;'可以被刪除而不會改變行爲 - 函數參數已經是clos的一部分ure,因此不需要嘗試將它們複製到局部變量,並且嘗試創建與函數參數具有相同名稱的局部變量不會執行任何操作。 – nnnnnn

回答

1

如果你想傳遞參數給你的方法,你應該把它們放在你的print功能,像這樣。

var Person = (function(){ 
 
    var print = function(name,age){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})(); 
 

 
Person.print("James",19);


或者,你可能會嘗試的參數直接傳遞到你的IIFE,但我不知道我看到這一點在這樣做,如果是這樣的案件。

var Person = (function(name,age){ 
 
    var print = function(){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})("James",19); 
 

 
Person.print();


是的,你可以只返回對象上的方法,但不會在技術上是揭示模塊模式。

var Person = (function(){ 
 
    return { 
 
     print: function(name,age){ 
 
      console.log('I"m '+name+', and I"m '+age+' year old'); 
 
     } 
 
    } 
 
})(); 
 

 
Person.print("James",19);

就個人而言,如果你真的想進入現代的JavaScript,我建議ES6模塊或模塊CommonJS的,與像的WebPack或Browserify建設者。

+0

啊我明白了,讓函數打印接收param而不是Person obj。我知道了!但是這是揭示模塊模式?我記得在Person對象中有私有變量用於封裝。 –

+0

@JessJordan是的,你可以在這個閉包中有私有變量和函數。只是不要歸還它們。 –

+0

ES6模塊與webpack有關嗎? –

1

這是因爲Immediately invoked function expression

在這裏你去固定片段。

var Person = (function(name,age){ 
 
    var name = name, age = age; 
 
    var print = function(){ 
 
     console.log('I"m '+name+', and I"m '+age+' year old'); 
 
    } 
 

 
    return {print:print} 
 
})("James",19); 
 

 
Person.print();

+1

這根本不靈活,我的人怎麼會動態呢? –

0

這是你想要的東西,讓名字和年齡共享變量

var Person = (function(name,age){ 
 
    var name = name, age = age; 
 
    
 
    var print = function(name,age){ 
 
     this.name = name; 
 
     this.age = age; 
 
     console.log('I"m '+this.name+', and I"m '+this.age+' year old'); 
 
     } 
 
    return {print:print} 
 
})(); 
 

 
Person.print("James",19);