关于Javascript函数的简单问题,调用/定义的差异

时间:2010-03-30 17:31:55

标签: javascript

有人可以解释以下函数定义之间的区别吗?

var alertMessage = function alertMessage(message) {
  alert(message);
}

var alertMessage = function(message) {
  alert(message);
}

每个人的含义是什么?谢谢!

2 个答案:

答案 0 :(得分:2)

两者都是函数表达式,基本上区别在于第一个是命名的,第二个是匿名的。

例如:

var test = function test(message) {
  alert(message);
};

var test1 = function(message) {
  alert(message);
};

test.name; // "test"
test1.name // "" or "anonymous"

注意:某些实现中存在函数对象的name属性,但它是非标准的。

此外,函数表达式的名称对调试很有用,因为您可以检查调用堆栈以查看它的位置。

此标识符只能从FunctionBody本身内部访问:

(function foo(){
  typeof foo; // "function"
})();
typeof foo; // "undefined"

但是JScript实现(在IE的所有版本中)都有一个bug,这个名称泄漏到它的封闭范围。

答案 1 :(得分:2)

两个定义都是函数表达式,而不是函数声明或Function构造函数创建的函数。它们都为变量alertMessage分配函数。区别在于第一个函数是命名的,而第二个函数是匿名的。

命名函数通常用于函数声明,例如

function alertMessage(message) { ... }

在这种情况下,函数声明在当前作用域中创建一个名为alertMessage的变量,该变量引用该函数。函数声明被提升到当前作用域的顶部,因此您可以在声明的函数在js文件中定义之前调用它们。

函数表达式中使用的命名函数(例如原始问题)不会创建此变量,也不会被提升到执行范围的顶部,因此按照惯例,大多数函数表达式都是匿名的。命名函数表达式的唯一好处是name变量绑定在函数中(尽管CMS提到,这是依赖于实现的),函数名称是从函数的toString方法输出的。这在调试期间非常有用(而不是让Firebug输出{{​​1}}用于大量匿名函数调用)。

MDC

更多细节