在 JavaScript 中声明函数

新手上路,请多包涵

这两种声明函数的方式有什么区别?

 function someFunc() { ... }

var someFunc = function() { ... }

我不是在技术意义上问。我不是在问哪种可读性更好,或者哪种风格更受欢迎。

原文由 nicholaides 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 424
2 个回答

我和这里的大多数人有不同的看法。 _从技术上讲,这种语法对于两种方式声明函数的意义可能相同_( 我在上一条陈述中的立场是错误的。我阅读了一篇差异帖子,为什么它们在技术上是差异的,我会在最后添加,为什么);但它们在演变模式中发挥作用的方式是巨大的。我强烈推荐 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);
}

原文由 Priyank 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 function someFunc() { ... } 的一个优点是函数名称出现在 Firebug 调试器中。以其他方式声明的函数 ( var someFunc = function() { ... } ) 以 匿名 形式出现。

原文由 Igor Zevaka 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题