混合javascript函数声明样式

混合javascript函数声明样式,javascript,function,declaration,Javascript,Function,Declaration,考虑两种类型的javascript函数声明(我认为有四种): 对 var foo = function() { // ... } 在许多情况下,这些行为都是相同的,我想我可以探究其中的主要区别,例如,这些问题: 两者都有与这一非常有用的解释相关的答案: 但我想把这两种风格结合在一起;一个简短/可缩小的局部变量名(因为我需要经常引用它)和一个描述性名称(我想从.name中获得一些友好的内容) 这就是我感到困惑的地方。这就好像立即将函数分配给变量的行为使其在自己的名称下未定义一样:

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

var foo = function() {
    // ...
}
在许多情况下,这些行为都是相同的,我想我可以探究其中的主要区别,例如,这些问题:

两者都有与这一非常有用的解释相关的答案:

但我想把这两种风格结合在一起;一个简短/可缩小的局部变量名(因为我需要经常引用它)和一个描述性名称(我想从
.name
中获得一些友好的内容)

这就是我感到困惑的地方。这就好像立即将函数分配给变量的行为使其在自己的名称下未定义一样:

var f = function foo() {
    // ...
};
console.log( f.name );   // "foo"
console.log( foo.name ); // !? error: foo is not defined ?!
因此,我们要问一个问题:为什么这不起作用?或者,更可能的是,我对这两种声明风格还有什么误解

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

var f = foo;
function foo() {
    // ...
}
console.log( f.name );   // "foo"
console.log( foo.name ); // "foo"
这到底有什么不同

PS:我认为这与这个问题不同:

这是关于我的困境的一个特例,变量名和函数名是相同的,即

var foo = function foo() {
    // ...
};
当你写作时

var f = function foo () { ... }
foo
的作用域只是函数的主体,而不是封闭函数。这主要用于创建匿名递归函数


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

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

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

function foo(){}
var f = function(){}
这将创建本地匿名(因此没有名称)函数,并将is分配给位于全局空间中的变量f:

function foo(){}
var f = function(){}
这将创建函数对象并将其分配给变量,它不存在于全局上下文中,只存在于f的局部,如上所述,但会分配名称foo:

var f = function foo(){}
<>编辑:为了更好的图片考虑以下

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

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

很快,谢谢!那么,你是说函数的“适当”名称的作用域在赋值中作为右值而不是作为单独的语句出现时是不同的(请参见下面带有错误的工作片段)。这是函数表达式和函数语句之间的区别。根据规范,这对封闭作用域有不同的影响。你链接中的答案很有帮助,再次感谢。。。我可能应该更广泛地搜索。