JavaScript中"匿名函数"和"函数文字"的区别?

Ric*_*uen 9 javascript terminology

学习JavaScript这本书将匿名函数定义如下......

功能是对象.因此,您可以通过使用构造函数并将函数分配给变量来创建它们 - 就像一个StringArray其他类型一样.在下面的代码中,使用Function构造函数创建一个新函数,函数体和参数作为参数传入:

var sayHi = new Function("toWhom", "alert('Hi' + toWhom);");
Run Code Online (Sandbox Code Playgroud)

这种类型的函数通常被称为匿名函数,因为函数本身不是直接声明或命名的.

这是JavaScript中"匿名函数"的正确定义吗?如果没有,什么是匿名函数,匿名函数和函数文字之间有什么区别?

ale*_*lex 16

函数表达式和函数声明

由于您对功能感兴趣,这里有一些重要的事情需要了解.

var abc = function() { ... }被称为函数表达式.该变量将在执行时分配给该匿名函数,但其​​变量声明将被提升到当前执行上下文(范围)的顶部.

但是,函数表达式也可以赋予名称,以便可以在其体内调用它以使其递归.请记住IE有一些问题.当您为其指定名称时,它绝对不是匿名函数.

一个函数,如function abc() { ... }被称为函数声明.它的定义被提升到其范围的顶部.它的名称在其内部及其父级范围内可用.

进一步阅读.


你的例子

它是一个匿名函数,但已分配给变量sayHi.

正如ŠimeVidas所提到的,Function使用new运算符实例化一个新对象,并将参数和函数体作为字符串传递.生成的对象被分配给sayHi.

使用这种方法创建函数的现实世界很少见(尽管它可能只是为了帮助显示函数是对象).我还相信将其参数列表和函数体作为字符串传递将调用一个eval()类型函数,当一个更好的构造可用时,这很少有用.

此外,创建的函数Function 不会形成闭包.

我只会使用这种方法,如果由于某种原因我需要创建一个Function带有它的参数和/或body只能作为字符串使用.

在现实世界中,你会......

var sayHi = function(toWhom) {
   alert('Hi' + toWhom);
};
Run Code Online (Sandbox Code Playgroud)

另请参阅FelixŠime的评论,以获得良好的讨论和进一步的澄清.

  • @Richard:我经常没有听过*function literal*.重要的是*函数表达式*和*函数声明*之间的区别.如果我们将函数表达式视为函数文字,那么不,它不相同.正如@alex已经解释的那样,有*命名的函数表达式*不再是匿名的,函数有一个名字.但它们仍然是函数表达式(=函数文字). (3认同)