混合javascript函数声明样式

时间:2013-10-03 21:38:10

标签: javascript function declaration

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

function foo() {
    // ...
}

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

在许多情况下,这些行为都是一样的,我认为我理解了主要区别,例如在这些问题:

difference-between-var-foo-function-and-function-foo

usual-functions-vs-function-variables-in-javascript

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

javascript-function-declaration-ambiguity

但我想在一个陈述中结合两种风格;一个短/可缩小的局部变量名称(因为我需要经常引用它)和一个描述性名称(我希望从.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:我认为这与这个问题不同:

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

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

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

2 个答案:

答案 0 :(得分:1)

写作时

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

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

whats the difference between function foo(){} and foo = function(){}?

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

答案 1 :(得分:1)

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

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

function foo(){}

这会创建本地匿名(因此没有名称)函数,并分配给生活在全局空间中的变量f:

var f = function(){}

这创建了函数对象并将其赋值给变量,它在全局上下文中不存在,只存在于f的本地,与上面相同,但是指定了名称foo:

var f = function foo(){}

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

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

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