我与这里的大多数人意见不同。 从技术上讲,这种语法对于两种方式声明函数可能意味着相同
(我的上一个陈述不正确。我在一篇差异文章中阅读了为什么它们在技术上存在差异,我会在最后补充一下,为什么)
;但它们在演变模式中发挥作用的方式是巨大的。我强烈推荐 Doughlas Crockford 的“Javascript: The Good Parts”。
但是要以一种微妙而简单的方式来证明我的观点;这是一个小例子。
//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”参数和参数对任何对象进行操作。
然而,第二个声明被声明为名为“海绵宝宝”的对象的属性。这一点很重要;在这里,我正朝着对象驱动的行为迈进。虽然我也保持“级联效应”,因为如果我没有其他东西可以返回,我会返回“this”。
类似的东西是在 jquery 中完成的;如果您正在尝试编写框架或其他东西,这种级联模式很重要。您还将它链接到 Builder 设计模式。
但是通过将函数声明为对象的属性,我能够实现以对象为中心的行为,从而产生更好的编程范式。除非设计得好;在外部声明的具有全局访问权限的单个函数会导致非面向对象的编码方式。不知何故,我更喜欢后者。
要查看级联效果,请查看最后一条语句,您可以在其中要求海绵宝宝立即发誓并道歉;尽管后来添加了“道歉”作为属性。
我希望我能说清楚。从技术角度来看,差异可能很小;但从设计和代码演变的角度来看,它是巨大的,并且让世界变得与众不同。
但那只是我!要么接受,要么离开它。 :)
编辑:
所以这两个调用在技术上是不同的;因为命名声明绑定到全局命名空间并在解析时定义。所以甚至可以在函数声明之前调用。
//success
swearOutLoud("Damn");
function swearOutLoud(swearWord) {
alert("You " + swearWord)
}
上面的代码可以正常工作。但下面的代码不会。
swear("Damn!");
var swear = function(swearWord) {
console.log(swearWord);
}