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

时间:2011-05-02 13:03:35

标签: javascript terminology

书籍Learning JavaScript定义匿名函数如下......

  

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

var sayHi = new Function("toWhom", "alert('Hi' + toWhom);");
     

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

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

5 个答案:

答案 0 :(得分:16)

函数表达式和函数声明

由于您对功能感兴趣,因此需要了解一些重要内容。

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

但是,函数表达式也可以赋予名称,以便可以在其体内调用它以使其递归。请记住IE has some issues。当你为它指定一个名字时,它绝对是不是一个匿名函数。

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

Further Reading


您的示例

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

Šime Vidas所述,使用Function运算符实例化新的new对象,并将参数和函数体作为字符串传入。生成的对象将分配给sayHi

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

此外,使用Function do not form a closure创建的功能。

我只会使用这种方法,如果由于某种原因我需要创建一个Function,其参数和/或正文只能作为字符串使用。

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

var sayHi = function(toWhom) {
   alert('Hi' + toWhom);
};

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

答案 1 :(得分:1)

我认为一个更广泛且更容易接受的匿名函数定义是一个没有名字的函数。

答案 2 :(得分:1)

匿名函数只是一个没有名称的函数。

function(a, b){
  return a + b;
}

上面的代码没用,因为它没有你可以调用它的名字。所以它们通常被分配给变量。

var func = function(a, b){
  return a + b;
}

这很有用,因为您可以将匿名函数传递给另一个函数或方法,而无需事先创建函数,如下所示。

function bob(a){
  alert(a());
}

bob(function(){
  return 10*10;
})

答案 3 :(得分:1)

此:

new Function("toWhom", "alert('Hi' + toWhom);")

和此:

function(toWhom) { alert('Hi' + toWhom); }

是两个产生相同结果的表达式 - 它们返回一个新的匿名函数对象。

第二个表达式(仅第二个表达式)称为函数表达式。您也可以将其称为函数文字(尽管我们可以认为函数声明也是函数文字)。

答案 4 :(得分:0)

function foo(){
    alert("i'm foo, nice to meet you!");
}
var bar = function(){
    alert("I am an anonymous function assigned to the variable \"bar\"");
}