考虑两种样式的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() {
// ...
};
答案 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")})();
是全局上下文中的函数(对象) - 首先是名称,第二个是没有名称。如果它们是在变量中创建的,则它的工作方式与上下文不同。