有人可以解释以下函数定义之间的区别吗?
var alertMessage = function alertMessage(message) {
alert(message);
}
var alertMessage = function(message) {
alert(message);
}
每个人的含义是什么?谢谢!
答案 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}}用于大量匿名函数调用)。