-1

可能重复:
JavaScript:var functionName = function() {} vs function functionName() {}

在 Javascript 中声明函数有两种方法:

语法 1:

function myFunction() {
    // something awesome
};

语法 2:

var myFunction = function() {
    // somtehing even more awesomer
};

在我看来,我在遗留代码中遇到的语法 1 比在编写良好的代码中更多(但这纯粹是经验性的)。

:应该prever 一种语法而不是另一种,为什么?

4

4 回答 4

1

我能想到的唯一区别就在这里:

此代码不运行:http: //jsfiddle.net/JdCRq/

myFunction();

var myFunction = function() {
    console.log('test');
};

虽然这段代码确实:http: //jsfiddle.net/JdCRq/1/

myFunction();

function myFunction() {
    console.log('test');
}

function在第二个示例的上下文中,块似乎在代码实际运行之前被声明(至少按名称)。

于 2012-10-03T18:25:21.027 回答
0

使用函数声明语句(第一种方式)声明函数将函数名称绑定到函数对象,从而允许调试器在堆栈跟踪中显示名称。var在这样的简单情况下,真的没有理由用声明来声明函数。(有时,当然,这是必要的,例如当您使用其他函数创建函数时。)

从语法上讲,函数实例化表达式(第二种方式)也可以包含绑定到函数的函数名称。不幸的是,一些 JavaScript 运行时不能正确处理这种情况并且表现得有些糟糕,所以这不是一个好主意。

于 2012-10-03T18:21:39.363 回答
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
于 2012-10-03T18:33:05.320 回答
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 !== f2f1返回falsef2会返回truenonUnique()也会给true

最后一个示例对于重用本机函数名称但保证它们的安全很有用。


Also note that variables effectively don't exist before the line with var whereas function syntax will, and see this question, which your question is a duplicate of.

于 2012-10-03T18:34:29.890 回答