JavaScript中函数文字的精确含义

时间:2012-09-07 08:58:40

标签: javascript literals function-literal

在JavaScript中有对象文字和函数文字。

对象文字:

myObject = {myprop:"myValue"}

功能文字:

myFunction = function() {
   alert("hello world");
}

字面文字有什么意义?我们可以说Java有方法文字吗?

public void myMethod() {
    System.out.println("are my literal");
}

6 个答案:

答案 0 :(得分:7)

不要将JavaScript与Java进行比较,它们与熊和鲸鱼有很多共同之处。 Java是一种面向对象的编程语言,而JavaScript是一种函数式编程语言。

使用函数式语言将函数概念作为第一类对象:函数可以分配给变量,可以作为参数传递,因为它们可以是其他函数的返回值。

对象文字是您即时和在线创建的对象。同样适用于函数文字。但是你给出的例子实际上类似于常规函数声明:

function foo()
{
    alert('bar');
}

移动到范围的顶部,转换

var foo = function()
{
    alert('bar');
};

有意义的是,当函数可以作为参数/返回值传递时:

var processed = (function(someFunc)//<-- argument name
{
    return function()
    {
        alert('I\'ll call some function in 2 seconds, get ready');
        setTimeout(someFunc,2000);//<-- passes a reference to foo, as an argument to setTimeout
    }
})(foo);//pass reference to function object foo here

这只是你可以用JS做的各种事情的开始,只要你不再把它当作Java的一个子集来处理....

答案 1 :(得分:6)

附加:

JavaScript中的函数文字是函数表达式的同义词。

与函数表达式并行,函数文字可以有一个可选的标识符(名称)。

因此,如果我们说函数表达式/函数文字,它包括没有标识符的函数表达式/函数文字(也称为匿名函数),还包括带有标识符的函数表达式/函数文字。即使在很多书中,函数表达式/函数文字也被用作函数表达式/函数文字的同义词而没有标识符(匿名函数)。

  

函数文字

     

使用函数文字创建函数对象:

     

//创建一个名为add的变量并在其中存储一个函数//   添加两个数字。

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

函数文字有四个部分。

     

第一部分是保留字功能。

     

可选的第二部分是函数的名称。该功能可以使用   它的名字递归调用自己。该名称也可以使用   用于识别功能的调试器和开发工具。如果一个   函数没有给出名称,如上例所示,它是   据说是匿名的。

     

第三部分是函数的参数集,包含在中   括弧。括号内是一组零个或多个参数   名称,以逗号分隔。这些名称将被定义为变量   在功能中。与普通变量不同,而不是   初始化为undefined,它们将被初始化为参数   在调用函数时提供。

     

第四部分是用大括号括起来的一组语句。这些   语句是函数的主体。它们是在执行时执行的   函数被调用。

     

函数文字可以出现在表达式可以的任何位置   出现......

     

来源:JavaScript: The Good Parts - Douglas Crockford

这意味着:

myFunction = function () {
   alert("hello world");
};

是函数表达式/函数文字,但也是:

myFunction = function myFunction() {
   alert("hello world");
};

是函数表达式/函数文字。

答案 2 :(得分:5)

最大的区别在于如何/何时解析和使用它。 以你的例子为例,

myFunction = function() {
   alert("hello world");
}

您只能在代码到达后运行myFunction(),因为您使用匿名函数声明变量。

如果您使用其他方式,

function myFunction(){
   alert("hello world");
}

此函数在编译时声明 ,可以在作用域中的任何时间使用。

请参阅this question also

答案 3 :(得分:2)

函数文字只是一个定义未命名函数的表达式。

函数文字的语法非常类似于函数语句的语法,除了它用作表达式而不是语句,不需要函数名。

因此,当您提供方法名称时,它不能是方法文字。

答案 4 :(得分:1)

在ECMA-262中找不到官方定义。

但是根据wikipedia和我学到的许多其他PL,文字是值的表达

这意味着:

sudo service odoo stop
sudo service postgresql restart
sudo service odoo start

是文字,而

function() {alert("hello world")}

不是。因为后者不仅表示值,而且表示引用

我赞成vsenol的回答,但现在我认为这是错误的。

答案 5 :(得分:0)

function literal不是function,而是function的值。

对于汇编语言程序员而言,它类似于block of code,存储在内存的.text区域中。

那么人们会想问function到底是什么。

function实际上是function literal的指针或引用,就像任何编程语言一样。


例如,

public void myMethod() {
    System.out.println("are my literal");
}

myMethod是一种方法。

{
    System.out.println("are my literal");
}

这是Java不支持的方法文字。