JavaScript函数声明风格

4
在Javascript中,我见过三种不同的定义函数的方式。
传统风格: function foo() { //做一些事情 } 新的Js Ninja风格: var foo = function(){ //做一些事情 } DOM特定风格: window.foo = function(){ //做一些事情 } 问题是,
上述三种方式有何不同?我应该使用哪一种,为什么?

可能是重复的问题,参考Javascript: var functionName = function() {} vs function functionName() {} - Frédéric Hamidi
同时,var foo = function foo() { //做一些事情 } - Marco Mariani
2个回答

11
第一种是函数声明。它是被提升的(你可以在当前作用域内任何地方使用它)。
第二种是使用匿名函数定义变量。变量被提升,赋值保持原位。直到分配函数的那一行之前,该函数可能不会被使用。
第三种是分配全局方法。类似于第二种,但使用全局对象,这并不好。
然而,你可以考虑第四种选择(命名函数表达式)。
var foo = function bar(){ //do something }

这里,bar仅在其自身内部可用,这对于递归很有用,而不会将当前范围与其混合。

您可以根据自己的需要选择任何方法。我只会反对第二种方法,因为它使函数的行为像变量。

一旦您提到第二个和第三个选项,我想提醒您污染全局对象被认为是一种不良实践。您最好考虑使用自执行匿名函数来创建单独的作用域,例如:

(function(){
    var t = 42; // window.t still does not exist after that
})();

我想你可能会发现一篇更详细的关于JavaScript作用域和变量提升的文章很有用。


“hoisted”是什么意思?此外,如果我使用第二种方法声明,有什么缺点?因为根据我对JavaScript的有限理解,所有东西都是对象--变量、函数。 - CuriousMind
您可以参考我提到的文章获取更多详细信息。简而言之,所有变量和函数声明都会在当前作用域的开头进行内部提升。首先是函数,然后是变量。赋值保留在原地。 - Li0liQ
优秀的帖子 + 那篇文章也很棒。 - JonnyRaa

2

如果我想声明一个全局函数 - 这两个有什么区别吗? - CuriousMind
1
通常情况下,您应该避免在全局范围内执行任何操作。@Gaurish。 - tereško

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接