用JavaScript声明函数
可能重复:
Javascript:var functionName = function(){} vs function functionName(){}
这两种声明函数的方式有什么区别?
function someFunc() { ... }
var someFunc = function() { ... }
我从技术角度不问。 我不问可读性更好,或者哪种风格更受欢迎。
我对这里的大多数人有不同的意见。 从技术上讲,这个语法对于声明函数的方式可能是相同的( 我在最后一个语句中表达了不正确的意思,我在差异文件中读到了他们为什么在技术上有差异,为什么我会添加 )。 但他们在不断演变的模式中发挥作用的方式非常庞大。 我强烈推荐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”参数和参数对任何对象执行操作。
然而,第二个声明被声明为一个名为“spongeBob”的对象的属性。 这一点很重要。 因为在这里我正在朝着一个对象驱动的行为迈进。 虽然我还保持“级联效应”,因为如果我没有别的东西可以返回,我会返回“this”。
类似的东西在jQuery中完成; 如果你试图编写一个框架或者其他东西,这个级联模式是很重要的。 你也可以将它链接到Builder设计模式。
但是通过将函数声明为对象的属性,我能够实现以对象为中心的行为,从而形成更好的编程范例。 除非设计得很好; 在全局访问之外声明的单个函数导致非面向对象的编码方式。 我不知何故更喜欢后者。
要看到级联的效果,看看最后一个声明,你可以让海绵发誓并立即道歉; 即使道歉后来被添加为属性。
我希望我明确我的观点。 与技术角度的区别可能很小; 但从设计和代码演进的角度来看,它是巨大的,并使世界有所不同。
但那就是我! 要么接受,要么离开它。 :)
编辑:
所以这两个电话在技术上是不同的; 因为命名声明与全局名称空间绑定,并在解析时定义。 所以甚至可以在函数声明之前调用。
//success
swearOutLoud("Damn");
function swearOutLoud(swearWord) {
alert("You " + swearWord)
}
上面的代码将正常工作。 但下面的代码不会。
swear("Damn!");
var swear = function(swearWord) {
console.log(swearWord);
}
使用function someFunc() { ... }
一个优点是函数名称出现在Firebug调试器中。 以另一种方式声明的var someFunc = function() { ... }
( var someFunc = function() { ... }
)以匿名形式出现 。
实际上,区别在于第二个声明使我们能够声明这样的函数,使得可以将函数作为对象的属性:
var myObject=new Object();
myObject.someFunc=function() { ... };
链接地址: http://www.djcxy.com/p/2827.html
上一篇: Declaring functions in JavaScript
下一篇: Problem using the nextLine() and hasNextLine() methods of Scanner