用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