JavaScript模块模式的差异
非常简单的问题,不确定是否在创建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
};
};
A和B是基本上相同的,虽然有一由于函数/变量提升,A和B之间的差别很小,理论上你可以编写代码在B中工作但在A中中断,但实际上你必须真正编写奇怪的代码才能这样做。
C会工作,但在概念上是错误的。在函数中使用this.funcName
的一点是作为构造函数(使用new Thing()
创建大量对象。如果您没有将该函数用作构造函数,则不应该使用该样式,因为扫描代码的人可能会将该函数误认为。构造函数,而不是其实际目的是一模块
前缀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);
这是一类^
''var前缀'var'并不会让它成为一个类。 – mattmanser 2013-03-21 11:25:34
@mattmanser阅读上面的编辑...这是一个伟大的课程:) – Jimmyt1988 2013-03-21 11:28:37
'var'是无关紧要的,它只会在你的函数由于函数和变量提升而被声明时改变。 ''var Dog = function(){}'只是一个写函数的函数Dog(){}' – mattmanser 2013-03-21 11:39:23
起初,你忘了执行函数表达式:该module pattern是IEFE你只需要创建一个功能
你的最后一个例子是废话,它看起来。像分配属性到this
时的构造函数一样 - 当作为IEFE执行时它会中断(并且与new
一起使用它会产生不希望的效果;当返回对象时它没用)。
有关第一个和第二个片段之间的区别,请参阅var functionName = function() {} vs function functionName() {}。在模块模式的上下文中,建议使用函数声明。
//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-17 08:20:56
除了事实最后也不会编译,没有任何区别。 – 2013-03-21 11:04:58
最后一个很糟糕(JavaScript中没有'self'),但其他两个完全一样。 – 2013-03-21 11:05:43
该死的......更新问题:D – 2013-03-21 11:07:45