匿名函数与正常函数

Blu*_*ire 21 javascript function anonymous-function

只是出于兴趣,它们之间是否有任何速度/功能差异

function foo(bar) {
    alert("foo" + bar);
}
Run Code Online (Sandbox Code Playgroud)

var foo = function(bar) {
    alert("foo" + bar);
};
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 25

没有明显的速度差异.(测试)

存在功能差异.

  • 函数声明(如第一个)和函数表达式(如第二个)在不同时间处理.
  • 它们对它们发生的范围有不同的影响.
  • 你的第一个函数有一个真正的名字,你的第二个函数不在 ES5和更早版本,你的第二个函数没有; 在ES6/ES2015中,确实如此,因为规范说JavaScript引擎必须在该情况下将变量的名称赋给函数.

如果你四处寻找"函数声明"和"函数表达",你会发现很多关于这个主题的讨论(其中一些甚至是正确的).

但简单地说:

功能声明

函数声明当执行光标进入其含有范围(含有功能或全局范围),任何一步一步的代码完成之前喜欢你的第一实例发生的情况.因此,它们不能出现在非功能块(if,try等)中,因为在处理它们时没有运行逐步代码.函数的名称被添加到它出现的范围中,并且函数对象具有真实的名称(尽管没有标准的方法来查询该名称,它在堆栈跟踪等方面仍然有用).(注意:有些JavaScript引擎允许在块内进行函数声明,但它无效,它们的作用不一定一致.不要这样做.)

匿名函数表达式

像第二个例子一样的函数表达式就像所有表达式一样,在代码的逐步流程中遇到它.您的表达式称为匿名函数表达式,因为它没有显式指定函数的名称.在ES5及更早版本中,这意味着生成的函数没有名称.在ES6/ES2015和后,用匿名函数表达式创造了许多功能有名字,因为名字可以从表情来推断,这就是你的榜样,在其功能与变量的名称结束的情况下:foo.由于匿名函数表达式是表达式,它们可以出现在表达式可以发生的任何地方,尽管有时您必须警告解析器这就是您正在做的事情.

命名函数表达式

还有第三种方法:命名函数表达式,而不是匿名函数表达式.它们看起来像这样:

var foo = function bar() {
};
Run Code Online (Sandbox Code Playgroud)

要么

var obj = {
    foo: function bar() {
    }
};
Run Code Online (Sandbox Code Playgroud)

要么

doSomething(function bar() { });
Run Code Online (Sandbox Code Playgroud)

等等

他们曾经是真正有问题的跨浏览器(IE8和更早版本混乱起来,例如,Safari浏览器的早期版本有问题,等等; Kangax具有良好的页面中所使用比比皆是的问题).它是一个表达式,因此只要有表达式,它就是有效的.的函数名(bar在我的例子)是由柔顺JavaScript引擎添加到含范围.