JavaScript中的函数表达式与声明之间有什么区别?
这个问题在这里已经有了答案:
他们其实非常相似。 你怎么称呼它们是完全一样的。区别在于浏览器如何将它们加载到执行上下文中。
函数声明在任何代码执行之前加载。
函数表达式仅在解释器到达该行代码时加载。
所以如果你在加载之前尝试调用一个函数表达式,你会得到一个错误! 如果你调用函数声明,它会一直工作,因为在加载所有声明之前不能调用代码。
示例:函数表达式
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 = function foo() { return 5; }
var foo = function foo() { return 5; }
与其他两个真的是一样的。 这只是这行代码用于导致safari中的错误,尽管它不再。
函数声明
function foo() { ... }
由于函数提升 ,可以在定义之后和之前调用以这种方式声明的函数。
函数表达式
命名函数表达式
var foo = function bar() { ... }
匿名函数表达式
var foo = function() { ... }
foo()
只能在创建后调用。
立即调用函数表达式(IIFE)
(function() { ... }());
结论
Crockford建议使用函数表达式,因为它明确指出foo
是一个包含函数值的变量。 那么,我个人更喜欢使用宣言,除非有表达的理由。
关于第三个定义:
var foo = function foo() { return 5; }
下面是一个例子,说明如何使用递归调用的可能性:
a = function b(i) {
if (i>10) {
return i;
}
else {
return b(++i);
}
}
console.log(a(5)); // outputs 11
console.log(a(10)); // outputs 11
console.log(a(11)); // outputs 11
console.log(a(15)); // outputs 15
编辑:闭包的更有趣的例子:
a = function(c) {
return function b(i){
if (i>c) {
return i;
}
return b(++i);
}
}
d = a(5);
console.log(d(3)); // outputs 6
console.log(d(8)); // outputs 8
链接地址: http://www.djcxy.com/p/17263.html
上一篇: What is the difference between a function expression vs declaration in JavaScript?