0

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

一种)

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

    return {
        bar: bar
    };
};

二)

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

4 回答 4

1

A 和 B 本质上是相同的,尽管由于函数/变量提升,A 和 B 之间存在非常小的差异,理论上你可以编写可以在 B 中工作但在 A 中中断的代码,但实际上你必须真的为此编写奇怪的代码。

C 可以工作,但在概念上是错误的。在函数中使用的要点this.funcName是作为构造函数(使用new Thing().它的实际目的是一个模块。

于 2013-03-21T11:28:39.383 回答
1

起初,您忘记执行函数表达式:模块模式是一个 IEFE。您只需创建一个函数。

你的最后一个例子是胡说八道,它在分配属性时看起来像一个构造函数this- 当作为 IEFE 执行时它会中断(并且使用它会new产生不良影响;当返回一个对象时它是无用的)。

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

于 2013-03-21T11:31:32.313 回答
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());

于 2017-04-17T07:59:54.303 回答
-2

在函数使其成为“类”-ish 之前添加前缀 var,这意味着您可以制作它的多个版本。这适用于 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);

这是一堂课^

于 2013-03-21T11:08:24.110 回答