2016-11-22 92 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);