14

在 JavaScript 中,既有对象字面量,也有函数字面量。

对象字面量:

myObject = {myprop:"myValue"}

函数字面量:

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

字面意思是什么?我们可以说 Java 有方法字面量吗?

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

6 回答 6

9

最大的区别是如何/何时解析和使用它。举个例子,

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

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

如果你使用其他方式,

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

这个函数是在编译时声明的,可以在范围内的任何时候使用。

也请参考这个问题

于 2012-09-07T09:11:20.743 回答
8

添加在:

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

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

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

函数字面量

函数对象是用函数字面量创建的:

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

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

函数文字有四个部分。

第一部分是保留字功能。

可选的第二部分是函数的名称。该函数可以使用其名称递归调用自身。调试器和开发工具也可以使用该名称来识别功能。如果一个函数没有名字,如前面的例子所示,它被称为匿名的。

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

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

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

来源:JavaScript:好的部分- 道格拉斯·克罗克福德

这意味着:

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

是一个函数表达式/函数字面量,但也是:

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

是一个函数表达式/函数字面量。

于 2016-10-02T20:19:52.900 回答
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 的一个子集......

于 2012-09-07T09:13:38.930 回答
4

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

函数文字的语法与函数语句的语法非常相似,不同之处在于它用作表达式而不是语句,并且不需要函数名称。

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

于 2012-09-07T09:03:56.397 回答
1

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

但是根据维基百科和我学到的许多其他 PL,文字是 values 的表达式

这意味着:

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

是文字,而:

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

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

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

于 2018-07-22T00:21:35.490 回答
0

Afunction literal不是 a function,而是表示 的值function

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

然后人们会想问 a 到底是什么function

A实际上是任何编程语言中function由 a 表示的函数值的指针或引用。function literal


例如,

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

如果我们有myMethodwhich 是一种方法,

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

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

于 2018-10-28T09:09:47.147 回答