没有在javascript中阻止“函数myFunction(){}”语法的函数声明?

时间:2012-10-03 18:19:54

标签: javascript

  

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

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

语法1:

function myFunction() {
    // something awesome
};

语法2:

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

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

:应该优先考虑另一种语法,为什么?

4 个答案:

答案 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)

同时使用varfunction可能会有一些优势,具体取决于您要实现的目标,以下是一些示例;

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 === f2f1现在将返回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会返回truenonUnique()也会true

最后一个示例可用于重用本机函数名称,但保证它们安全。


另请注意,在使用var的行之前,变量实际上不存在,而函数语法将会,并且this question,您的问题是重复的。