在Javascript中,我见过三种不同的定义函数的方法。
- 传统风格:
function foo()
{
//do something
}
- New Js Ninja Style
var foo = function(){
//do something
}
- DOM特定样式
window.foo = function(){
//do something
}
问题是什么,
以上三者的区别是什么?我应该用哪一个&为什么?
第一个是函数声明。它被提升(您可以在当前作用域内的任何地方使用它)。
第二个是使用匿名函数的变量定义。变量被提升,赋值保持不变。该函数在指定该行之前不能使用。
第三个是分配一个全局方法。与第二个类似,但使用全局对象,这不是很好。
然而,您可以考虑第四种选择(命名函数表达式):var foo = function bar(){ //do something }
这里,bar只在自身内部可用,这对于递归很有用,并且不会搅动当前作用域。
您正在根据您的需要选择任何方法。我只反对第二种方法,因为它使函数表现得像一个变量。
当你提到第二个和第三个选项时,我想提醒大家污染全局对象被认为是不好的做法。你最好考虑使用自执行匿名函数来创建单独的作用域,例如
(function(){
var t = 42; // window.t still does not exist after that
})();
我想你可能会发现一篇更详细的关于JavaScript作用域和提升的文章很有用。
首先,参见Javascript: var functionName = function() {} vs function functionName(){}。
然后我们得到var foo =
和window.foo =
之间的差异。
第一个是一个局部作用域的变量,这很好(除非它是在全局作用域中完成的)。第二个是显式全局变量,它具有全局变量的所有常见问题(例如与其他代码冲突的可能性)。