1

考虑两种样式的 javascript 函数声明(我认为是四种):

function foo() {
    // ...
}

相对

var foo = function() {
    // ...
}

在许多情况下,它们的行为是相同的,我认为我理解了主要区别,如这些 SO 问题中所解释的:

var-foo 函数与函数 foo 之间的区别

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

两者都有链接到这个非常有用的解释的答案:

javascript 函数声明歧义

但我想将这两种风格结合在一个声明中;一个简短/可缩小的局部变量名称(因为我需要经常引用它)和一个描述性名称(我想从中得到一些友好的东西.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:我认为这与这个 SO 问题不同:

在-javascript-what-is-the-motivation-or-advantage-of-using-var-foo-function-f...

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

var foo = function foo() {
    // ...
};
4

2 回答 2

1

这就是我的看法。javascript 中的每个函数都继承自 Function 对象,并且 Function 对象具有属性 .name。

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

function foo(){}

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

var f = function(){}

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

var f = function foo(){}

编辑:为了更好的图片考虑以下

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

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

于 2013-10-03T22:06:35.307 回答
1

当你写

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

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

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

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

于 2013-10-03T21:51:27.620 回答