揭示模块模式得到了未定义的变量

时间:2016-11-22 03:15:20

标签: javascript

刚开始认真对待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(){

  } 
};

3 个答案:

答案 0 :(得分: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,我建议使用像Webpack或Browserify这样的构建器来推荐ES6模块或CommonJS模块。

答案 1 :(得分: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();




答案 2 :(得分: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);