JS:函数表达式的函数与方法有什么区别?
JS: what's the difference between function vs method on function expressions?
最近我一直在学习 JS 模块模式,我已经看到至少 3-4 种创建具有 public 和私有属性的函数表达式的方法。我的问题是我不明白它们之间的最大区别是什么以及最佳方法/最佳实践是什么。
以下 4 个示例的语法不同,但调用方式相同。你能解释一下它们之间有什么区别吗?
示例 A - 我声明函数 func() 并且 return 仅 method/function 名称。
var funcA = function() {
var hi = "hello";
function bye() {
return 'bye';
}
function hello() {
return hi;
}
return {
hello: hello
}
}();
示例 B - 这里我声明 foo = function() 和 return 只有 method/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 - 与上一个相同,但所有函数都包含在 ()
.
中
var funcD = (function() {
var hi = "hello";
var bye = function() {
return 'bye';
}
return {
hello: function() {
return hi;
}
}
})();
在每种情况下,如果我想调用 hello(),我只写 funcX.hello()
和所有 return "hello"
但它们都是通过不同的方式创建的。什么是正确的?如果有正确的方法。
谢谢。
首先值得注意的是,从 bye
和 hello
中省略 var 关键字实际上会使它们成为全局的。
现在的区别:
var hello = function () {}
return {
hello: hello
};
和
return {
hello: function () {}
};
是 none,因为您只是以任何一种方式传递函数。将函数存储在变量中具有优势,您可以在范围内的其他位置使用它。
现在要注意的一个区别是函数的声明。
var myFunc = function () {}
对
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() {}
最近我一直在学习 JS 模块模式,我已经看到至少 3-4 种创建具有 public 和私有属性的函数表达式的方法。我的问题是我不明白它们之间的最大区别是什么以及最佳方法/最佳实践是什么。
以下 4 个示例的语法不同,但调用方式相同。你能解释一下它们之间有什么区别吗?
示例 A - 我声明函数 func() 并且 return 仅 method/function 名称。
var funcA = function() {
var hi = "hello";
function bye() {
return 'bye';
}
function hello() {
return hi;
}
return {
hello: hello
}
}();
示例 B - 这里我声明 foo = function() 和 return 只有 method/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 - 与上一个相同,但所有函数都包含在 ()
.
var funcD = (function() {
var hi = "hello";
var bye = function() {
return 'bye';
}
return {
hello: function() {
return hi;
}
}
})();
在每种情况下,如果我想调用 hello(),我只写 funcX.hello()
和所有 return "hello"
但它们都是通过不同的方式创建的。什么是正确的?如果有正确的方法。
谢谢。
首先值得注意的是,从 bye
和 hello
中省略 var 关键字实际上会使它们成为全局的。
现在的区别:
var hello = function () {}
return {
hello: hello
};
和
return {
hello: function () {}
};
是 none,因为您只是以任何一种方式传递函数。将函数存储在变量中具有优势,您可以在范围内的其他位置使用它。
现在要注意的一个区别是函数的声明。
var myFunc = function () {}
对
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() {}