javascript模块模式的差异

时间:2013-03-21 11:03:32

标签: javascript module

非常简单的问题,不确定这些创建javascript“模块”的方式是否存在任何差异。我希望有人可以为我澄清一下。

A)

var foo = function() {
    var bar = function() {
        console.log('test');
    };

    return {
        bar: bar
    };
};

B)

var foo = function() {
    function bar() {
        console.log('test');
    };

    return {
        bar: bar
    };
};

C)

var foo = function() {
    this.bar = function() {
        console.log('test');
    };

    return {    
        bar: this.bar
    };
};

4 个答案:

答案 0 :(得分:1)

A和B基本相同,但是由于函数/变量提升,A和B之间存在非常小的差异,理论上你可以编写可以在B中工作但在A中断的代码,但实际上你说的是必须真正编写奇怪的代码才能这样做。

C会起作用,但在概念上是错误的。在函数中使用this.funcName的意义是作为构造函数(使用new Thing()创建大量对象。如果您不使用该函数作为构造函数,则不应将该样式用作扫描的人代码可能会将函数误认为构造函数而不是作为模块的实际目的。

答案 1 :(得分:1)

首先,您忘记执行函数表达式:module pattern是IEFE。你只需创建一个函数。

你的最后一个例子是无意义的,它在将属性赋值给this时看起来像构造函数 - 当作为IEFE执行时它会中断(并且使用new时会产生不良影响;返回时一个没用的对象。

有关第一个和第二个代码段之间的差异,请参阅var functionName = function() {} vs function functionName() {}。在模块模式的上下文中,建议使用函数声明。

答案 2 :(得分:0)

//Javascript Module Pattern
var person = (function() {
  var cname = 'CheapFlight';
  return {
   name: "Santosh Thakur",
   getAge: function() {
    return cname;
   },
   growOlder: function() {
    return cname + " Updated";
 }
 };
}());
person.cname = "New Company"
console.log(person.cname);
console.log(person.name);
console.log(person.getAge());
console.log(person.growOlder());

答案 3 :(得分:-2)

前缀var在一个函数使它成为"类" -ish之前,这意味着你可以创建它的许多版本。这适用于A

例如:

  var hi = function()
  {
    var bye = function()
    {
        alert("bye");
    }   
    bye(); // this will call bye
    var something = new bye(); // this will create a new instance of bye();
  }

  var something = new hi();
  something();

B表示你只能调用bar,而不是在函数内创建它的新实例。

C因为其范围

而与bar相同

类肥胖型:

var Dog = function( hair, type )
{
     this.hair = hair;
     this.type = type;
}

var fred = new Dog( "long", "Dalmation" );
alert( fred.hair );    

var dave = new Dog( "short", "Poodle" );
alert( dave.type);

这是一个类^