可能重复: Javascript:var functionName = function(){}与function functionName(){}
这两种声明函数的方式有什么区别?
function someFunc() { ... }
var someFunc = function() { ... }
我不是在技术上问。我不是在问哪种更好的可读性,或者哪种风格是首选。
最佳答案
我对这里的大多数人持不同意见。从技术上讲,这两种语法在两种函数中的声明含义相同 (我在上一句话中表示不对。我在差异文章中仔细阅读了为什么它们在技术上是差异性的,最后我将添加,为什么) ;但是它们在模式演变中的作用方式是巨大的。我强烈推荐Doughlas Crockford撰写的“ Javascript:好的部分”。
但是以一种微妙而简单的方式证明我的观点;这是一个小例子。
//Global function existing to serve everyone
function swearOutLoud(swearWord) {
alert("You "+ swearWord);
}
//global functions' territory ends here
//here is mr. spongebob. He is very passionate about his objects; but he's a bit rude.
var spongeBob = {
name : "squarePants",
swear : function(swearWord) {
name = "spongy";
alert("You "+ swearWord);
return this;
}
}
//finally spongebob learns good manners too. EVOLUTION!
spongeBob.apologize = function() {
alert("Hey " + this.name + ", I'm sorry man!");
return this;
}
//Ask spongebob to swear and then apologize in one go (CASCADING EFFECT!!)
alert(spongeBob.swear("twit").apologize());
如果您看一下上面的代码,我就声明了一个名称为swearOutLoud的函数。它将从任何对象或呼叫中吐出脏话,并为您提供输出。它可以使用传递给对象的“ this”参数和参数对任何对象执行操作。
但是,第二个声明被声明为称为“ spongeBob”的对象的属性。这一点很重要;在这里,我正在朝着对象驱动的行为前进。如果我没有其他要返回的内容,则在返回“ this”的同时也保持“层叠效果”。
在jquery中也做了类似的事情。如果您要编写框架或其他内容,则此级联模式非常重要。您还将把它链接到Builder设计模式。
但是通过将函数声明为对象的属性,我能够实现以对象为中心的行为,从而导致更好的编程范例。除非设计得好;使用全局访问权在外部声明的各个函数导致了一种非面向对象的编码方式。我以某种方式更喜欢后者。
要查看级联的效果,请查看最后一个声明,您可以在该声明中让海绵宝宝立即宣誓并道歉;即使以后添加了道歉作为属性。
我希望我说清楚。从技术角度来看,差异可能很小;但是从设计和代码演变的角度来看,它是巨大的,并且与众不同。
但这就是我!要么接受,要么离开它。 :)
编辑:
因此,这两个调用在技术上是不同的;因为命名声明绑定到全局名称空间,并且是在解析时定义的。因此,即使在函数声明之前也可以调用它。
//success
swearOutLoud("Damn");
function swearOutLoud(swearWord) {
alert("You " + swearWord)
}
上面的代码将正常工作。但是下面的代码不会。
swear("Damn!");
var swear = function(swearWord) {
console.log(swearWord);
}