可能重复:
JavaScript: var functionName = function() {} vs function functionName() {}
在Javascript中声明函数有两种方法:
语法1:
function myFunction() {
// something awesome
};
语法2:
var myFunction = function() {
// somtehing even more awesomer
};
在我看来,我在遗留代码中遇到的语法比在编写良好的代码中要多得多(但这纯粹是经验性的)。
问:应该优先考虑另一种语法,为什么?
答案 0 :(得分:1)
我能想到的唯一区别就是:
此代码无法运行:http://jsfiddle.net/JdCRq/
myFunction();
var myFunction = function() {
console.log('test');
};
虽然此代码执行:http://jsfiddle.net/JdCRq/1/
myFunction();
function myFunction() {
console.log('test');
}
在第二个示例的上下文中, function
块似乎在代码实际运行之前被声明(至少通过名称)。
答案 1 :(得分:0)
使用函数声明语句(第一种方式)声明函数将函数名称绑定到函数对象,以便允许调试器在堆栈跟踪中显示名称。在这种简单的情况下,没有理由用var
声明来声明函数。 (当然,有时候,当你用其他函数创建函数时,这是必要的。)
从语法上讲,函数实例化表达式(第二种方式)还包含一个绑定到函数的函数名称。不幸的是,一些JavaScript运行时don't handle that case properly并且表现得有点糟糕,所以这不是一个好主意。
答案 2 :(得分:0)
第一个例子是声明函数的常规方法。
第二个示例是分配给变量的匿名函数。当您将一个函数声明为一个对象的成员,或者将它指定给一个类的原型时,它会被使用,并且当声明一个函数的常规方法就足够了时,有时也会在分配给常规变量时使用。
示例之间唯一的实际区别是第二种方式是在运行时分配的。如果重新定义函数,则在解析代码时会发生这种情况,因此只存在最后一个函数:
console.log(f()); // shows 2
function f() { return 1; }
console.log(f()); // shows 2
function f() { return 2; }
console.log(f()); // shows 2
(虽然你通常不会重新定义这样的函数,因为它会使代码难以理解。)
使用匿名函数,在分配之前它不存在,如果重新分配,它将更改为新函数:
condole.log(f); // shows undefined
var f = function(){ return 1 };
console.log(f()); // shows 1
f = function(){ return 2 };
console.log(f)); // shows 2
答案 3 :(得分:0)
同时使用var
和function
可能会有一些优势,具体取决于您要实现的目标,以下是一些示例;
var f1 = function nonUnique () {return true;},
f2 = function nonUnique () {return false;};
表示f1.name === f2.name
,但f1 !== f2
function nonUnique () {return true;};
var f1 = nonUnique;
function nonUnique () {return false;}; // this line changes f1 too
var f2 = nonUnique;
表示f1 === f2
,f1
现在将返回false
。
function nonUnique () {return true;};
var f1 = nonUnique,
f2 = f1;
f1 = function nonUnique () {return false;}; // this line changes f1 but not f2
表示f1 !== f2
; f1
会返回false
,但f2
会返回true
。 nonUnique()
也会true
。
最后一个示例可用于重用本机函数名称,但保证它们安全。
另请注意,在使用var
的行之前,变量实际上不存在,而函数语法将会,并且this question,您的问题是重复的。