下面几行代码之间的区别是什么?
//Function declaration
function foo() { return 5; }
//Anonymous function expression
var foo = function() { return 5; }
//Named function expression
var foo = function foo() { return 5; }
什么是命名/匿名函数表达式?
什么是声明函数?
浏览器如何以不同的方式处理这些结构?
对类似问题(var functionName = function() {} vs function functionName(){})的响应不完全正确?
第一条语句取决于声明它的上下文。
如果在全局上下文中声明,它将创建一个隐含的全局变量“foo”,它将是一个指向函数的变量。因此,函数调用“foo()”可以在javascript程序的任何地方执行。
如果函数是在闭包中创建的它会创建一个隐含的局部变量foo然后你可以用foo()来调用闭包中的函数
编辑:
我还应该说,函数语句(第一个)在函数表达式(其他两个)之前被解析。这意味着如果你在脚本底部声明了函数,你仍然可以在脚本顶部使用它。函数表达式只有在被执行代码命中时才会被求值。
最后编辑
表述2和表述3彼此相当。同样,如果在全局上下文中使用,它们将创建全局变量,如果在闭包中使用,将创建局部变量。但是值得注意的是,语句3将忽略函数名,所以本质上你可以调用任何函数。因此
var foo = function foo() { return 5; }
和
var foo = function fooYou() { return 5; }
它们其实很相似。你怎么称呼他们都一样。区别在于浏览器如何将它们加载到执行上下文中。
函数声明在执行任何代码之前加载。
函数表达式只在解释器到达那行代码时加载。
因此,如果你试图在函数表达式加载之前调用它,你会得到一个错误!如果相反地调用函数声明,它将始终工作,因为在加载所有声明之前不能调用任何代码。
示例:函数表达式
alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; }
示例:函数声明
alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; }
关于你问题的第二部分:
Var foo =函数foo(){返回5;}和其他两个是一样的。只是这行代码曾经在safari中导致错误,尽管现在已经不再这样了。