2013-03-21 63 views
0

非常简单的问题,不确定是否在创建JavaScript“模块”的这些方式上有任何差异。我希望有人能为我澄清。一个函数之前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 
    }; 
}; 
+0

除了事实最后也不会编译,没有任何区别。 – 2013-03-21 11:04:58

+1

最后一个很糟糕(JavaScript中没有'self'),但其他两个完全一样。 – 2013-03-21 11:05:43

+0

该死的......更新问题:D – 2013-03-21 11:07:45

回答

1

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

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

-2

前缀VAR使它成为一个 “阶级” -ish,这意味着你可以做它的许多版本。这同样适用于一个

例如:

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表示你只能打电话吧,不会让在函数内部它的一个新的实例。

C是因为它的范围相同条

类肥胖型:

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); 

这是一类^

+0

''var前缀'var'并不会让它成为一个类。 – mattmanser 2013-03-21 11:25:34

+0

@mattmanser阅读上面的编辑...这是一个伟大的课程:) – Jimmyt1988 2013-03-21 11:28:37

+0

'var'是无关紧要的,它只会在你的函数由于函数和变量提升而被声明时改变。 ''var Dog = function(){}'只是一个写函数的函数Dog(){}' – mattmanser 2013-03-21 11:39:23

1

起初,你忘了执行函数表达式:该module pattern是IEFE你只需要创建一个功能

你的最后一个例子是废话,它看起来。像分配属性到this时的构造函数一样 - 当作为IEFE执行时它会中断(并且与new一起使用它会产生不希望的效果;当返回对象时它没用)。

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

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());

+0

请添加一些解释给你的答案中包含的代码。 – 2017-04-17 08:20:56