最近我一直在学习JS模块模式,并且我已经看到至少3-4种方法来创建具有公共和私有属性的函数表达式。我的问题是,我不明白它们之间的最佳区别是什么,以及最佳方法/最佳实践。
以下4个示例的语法不同,但所有都以相同的方式调用。你能解释一下他们之间的区别吗?
示例A - 我声明函数func()并仅返回方法/函数名称。
var funcA = function() {
var hi = "hello";
function bye() {
return 'bye';
}
function hello() {
return hi;
}
return {
hello: hello
}
}();
示例B - 这里我声明foo = function()并仅返回方法/函数名称。
var funcB = function() {
var hi = "hello";
var bye = function() {
return 'bye';
}
var hello = function() {
return hi;
}
return {
hello: hello
}
}();
示例C - 这里我在return
中声明了foo = function()var funcC = function() {
var hi = "hello";
var bye = function() {
return 'bye';
}
return {
hello: function() {
return hi;
}
}
}();
示例D - 与prev相同,但所有功能都包含在()
。
var funcD = (function() {
var hi = "hello";
var bye = function() {
return 'bye';
}
return {
hello: function() {
return hi;
}
}
})();
在每种情况下,如果我想调用hello(),我只需编写funcX.hello()
并且所有这些都返回"hello"
但所有这些都是通过不同的方式创造的。什么是正确的?如果有正确的方法。
感谢。
答案 0 :(得分:3)
值得注意的是,从bye
和hello
中删除var关键字实际上会使它们成为全局。
现在区别:
var hello = function () {}
return {
hello: hello
};
并且
return {
hello: function () {}
};
没有,因为你只是以任何一种方式传递函数。将函数存储在变量中具有可以在范围内的其他位置使用它的优点。
现在需要注意的一个区别就是宣布这个功能。
var myFunc = function () {}
VS
function myFunc () {}
具有关键字infront的那些会立即进入范围,因此在您到达声明之前它们可用。使用var,情况并非如此。例如
function a() {
b();
}
a();
var b = function () {
console.log('hi')
}
当调用a时,它将抛出错误,因为未定义b。如果你这样做,但是:
function a() {
b();
}
a();
function b() {
console.log('hi')
}
它会正常工作。这被称为吊装。第一个称为函数表达式var thing = function() {}
,其中最后一个称为函数声明function thing() {}