我和这里的大多数人意见不同。从技术上讲,这种语法可能对两种方式声明函数的含义相同(我的最后一句话不正确。我在一篇不同的帖子上读到了为什么他们在技术上存在差异,最后我会补充,为什么); 但它们在进化模式中发挥作用的方式是巨大的。我强烈推荐Doughlas Crockford的《Javascript:The Good Parts》。
但要用一种微妙而简单的方式证明我的观点;这是一个小例子。
//现有全球职能部门为每个人服务函数swearOutLoud(swearWord){alert(“You”+swearWord);}//全球职能部门的领土到此为止//这是海绵宝宝先生。他对自己的目标充满热情;但他有点粗鲁。var海绵机器人={name:“方裤”,swear:函数(swearWord){name=“海绵状”;alert(“You”+swearWord);返回此;}}//最后海绵宝宝也学会了礼貌。进化!spongeBob.apologize=函数(){警惕(“嘿”+“this.name”+“对不起,伙计!”);返回此;}//让海绵宝宝发誓,然后马上道歉(级联效应!!)alert(spongeBob.sear(“twit”).道歉());
如果你看看上面的代码,我声明了一个名为swearOutLoud的函数。这将从任何对象或调用中获取脏话,并向您提供输出。它可以使用传递给它的“this”参数和参数对任何对象进行操作。
然而,第二个声明声明为名为“spongeBob”的对象的属性。这一点值得注意;在这里,我正朝着对象驱动的行为前进。当我没有其他东西要返回时,我也会保持“级联效应”,返回“this”。
类似的操作在jquery中完成;如果您试图编写框架或其他东西,那么这种级联模式非常重要。您还将其链接到Builder设计模式。
但是,使用声明为对象属性的函数,我能够实现以对象为中心的行为,从而形成更好的编程范例。除非设计良好;使用全局访问在外部声明的单个函数导致了一种非面向对象的编码方式。不知何故,我更喜欢后者。
要想看到级联效应,请看最后一句话,你可以要求海绵宝宝立即发誓并道歉;尽管道歉后来被添加为属性。
我希望我能把我的观点说清楚。从技术角度来看,差异可能很小;但从设计和代码进化的角度来看,它是巨大的,并使世界变得不同。
但那只是我!要么接受,要么放弃
编辑:
因此,这两种调用在技术上是不同的;因为命名声明绑定到全局命名空间,并在解析时定义。甚至可以在声明函数之前调用。
//成功swearOutLoud(“该死”);函数swearOutLoud(swearWord){警报(“You”+swearWord)}
上述代码将正常工作。但下面的代码不会。
发誓(“该死!”);var swear=函数(swearWord){console.log(swearWord);}