混合JavaScript函数声明样式

mixing javascript function declaration styles

考虑两种类型的javascript函数声明(我认为是四种声明中的一种):

1
2
3
function foo() {
    // ...
}

对战

1
2
3
var foo = function() {
    // ...
}

在许多情况下,这些问题的表现都是一样的,我想我会摸索其中解释的主要区别,例如,这些问题:

变量foo函数与函数foo的区别

javascript中的常用函数与函数变量

这两个问题的答案都与这个非常有帮助的解释有关:

javascript函数声明不明确

但我想在一个语句中组合两种样式:一个短的/可缩小的局部变量名(因为我需要经常引用它)和一个描述性名称(我想从.name中得到一些友好的名称)。

这就是我困惑的地方。就好像立即将函数赋给变量的行为会使它在自己的名称下保持未定义:

1
2
3
4
5
var f = function foo() {
    // ...
};
console.log( f.name );   //"foo"
console.log( foo.name ); // !? error: foo is not defined ?!

所以要回答这个问题:为什么这不起作用?或者,更可能的是,我对这两种申报方式还有什么误解呢?

注意,以下情况不会导致错误:

1
2
3
4
5
6
var f = foo;
function foo() {
    // ...
}
console.log( f.name );   //"foo"
console.log( foo.name ); //"foo"

这到底有什么不同?

附言:我认为这和这个问题不同,所以问题是:

in-javascript-what-is-the-rimotion-or-advantage-of-using-var-foo-function-f…

这是关于我困境的一个特殊情况,其中变量名和函数名是相同的,即。

1
2
3
var foo = function foo() {
    // ...
};


我就是这样看的。javascript中的每个函数都继承自函数对象,函数对象具有property.name。

这将在全局空间中创建名为foo的函数对象:

1
function foo(){}

这将创建本地匿名(因此没有名称)函数,并将is赋给全局空间中的变量f:

1
var f = function(){}

这将创建函数对象并将其分配给变量,它不存在于全局上下文中,仅局部存在于f,与上面相同,但分配名称foo:

1
var f = function foo(){}

编辑:为了获得更好的图片,请考虑以下内容

1
2
(function foo(){console.log("executing foo")})();
(function(){console.log("executing anonymous")})();

都是全局上下文中的函数(对象)-第一个带名称,第二个不带名称。如果它们是在变量中创建的,则工作原理相同,只是上下文不同。


当你写作时

1
var f = function foo () { ... }

foo的作用域只是函数的主体,而不是封闭函数。这主要用于创建匿名递归函数。

函数foo()和foo=function()有什么区别?

建议不要使用该符号,因为它们在某些实现中不能正常工作。