javascript - 在 JavaScript 中声明函数

标签 javascript syntax function

<分区>

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

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 设计模式。

但是通过将函数声明为对象的属性,我能够实现以对象为中心的行为,从而形成更好的编程范例。除非设计得好;在外部声明的具有全局访问权限的单个函数导致了一种非面向对象的编码方式。我更喜欢后者。

要查看级联效果,请查看最后一条语句,您可以让海绵宝宝立即发誓并道歉;即使后来将道歉添加为属性。

我希望我把我的观点说清楚。从技术 Angular 来看,差异可能很小;但从设计和代码演变的 Angular 来看,它是巨大的,并且让世界变得不同。

但这就是我!要么接受,要么离开它。 :)

编辑:

所以这两个调用在技术上是不同的;因为命名声明绑定(bind)到全局命名空间并在解析时定义。因此甚至可以在声明函数之前调用。

 //success
 swearOutLoud("Damn");

function swearOutLoud(swearWord) {
    alert("You " + swearWord)
}

以上代码将正常工作。但是下面的代码不会。

swear("Damn!");
    var swear = function(swearWord) {
    console.log(swearWord);
}

关于javascript - 在 JavaScript 中声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1925976/

相关文章:

javascript - 将Child dataURI图像附加到window.open在IE中失败

python - 如何将值与反斜杠进行比较?

javascript - 执行函数查看 JSON 文件是否包含特定字符串

c++ - C++ 中的 << 运算符是什么?

javascript - 如何制作 'csgocrash' 样式的图表

javascript - 你知道任何显示如何使用 Canvas 绘制思维导图的示例代码吗?

声明字节数组时出现 C++ 语法错误

css - 如何在 CSS 中处理带有 '.' 的 id 标签

mysql - 如何在 case 语句中创建循环

javascript - 动态改变热图的色标