在 JavaScript 中,既有对象字面量,也有函数字面量。
对象字面量:
myObject = {myprop:"myValue"}
函数字面量:
myFunction = function() {
alert("hello world");
}
字面意思是什么?我们可以说 Java 有方法字面量吗?
public void myMethod() {
System.out.println("are my literal");
}
在 JavaScript 中,既有对象字面量,也有函数字面量。
对象字面量:
myObject = {myprop:"myValue"}
函数字面量:
myFunction = function() {
alert("hello world");
}
字面意思是什么?我们可以说 Java 有方法字面量吗?
public void myMethod() {
System.out.println("are my literal");
}
最大的区别是如何/何时解析和使用它。举个例子,
myFunction = function() {
alert("hello world");
}
您只能myFunction()
在代码到达那里之后运行,因为您使用匿名函数声明了一个变量。
如果你使用其他方式,
function myFunction(){
alert("hello world");
}
这个函数是在编译时声明的,可以在范围内的任何时候使用。
也请参考这个问题。
添加在:
JavaScript 中的函数字面量是函数表达式的同义词。
与函数表达式平行,函数字面量可以有一个可选的标识符(名称)。
因此,如果我们说函数表达式/函数字面量,它包括没有标识符的函数表达式/函数字面量(也称为匿名函数),还包括带有标识符的函数表达式/函数字面量。即使在很多书籍中,函数表达式/函数文字被用作没有标识符的函数表达式/函数文字的同义词(匿名函数)。
函数字面量
函数对象是用函数字面量创建的:
// 创建一个名为 add 的变量并在其中存储一个函数 // 将两个数字相加。
> var add = function (a, b) {
> return a + b; };
函数文字有四个部分。
第一部分是保留字功能。
可选的第二部分是函数的名称。该函数可以使用其名称递归调用自身。调试器和开发工具也可以使用该名称来识别功能。如果一个函数没有名字,如前面的例子所示,它被称为匿名的。
第三部分是函数的参数集,用括号括起来。括号内是一组零个或多个参数名称,以逗号分隔。这些名称将被定义为函数中的变量。与普通变量不同的是,它们不会被初始化为 undefined,而是会被初始化为调用函数时提供的参数。
第四部分是一组用大括号括起来的语句。这些语句是函数的主体。它们在调用函数时执行。
函数文字可以出现在表达式可以出现的任何地方......
来源:JavaScript:好的部分- 道格拉斯·克罗克福德
这意味着:
myFunction = function () {
alert("hello world");
};
是一个函数表达式/函数字面量,但也是:
myFunction = function myFunction() {
alert("hello world");
};
是一个函数表达式/函数字面量。
不要将 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 的一个子集......
函数文字只是定义未命名函数的表达式。
函数文字的语法与函数语句的语法非常相似,不同之处在于它用作表达式而不是语句,并且不需要函数名称。
因此,当您给出方法名称时,它不能是方法文字。
在 ECMA-262 中没有找到官方定义。
但是根据维基百科和我学到的许多其他 PL,文字是 values 的表达式。
这意味着:
function() {alert("hello world")}
是文字,而:
function hello_world() {alert("hello world")}
不是。因为后者不仅表示一个值,而且表示一个引用。
我赞成 vsenol 的回答,但现在我认为这是错误的。
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");
}
如果我们有myMethod
which 是一种方法,
{
System.out.println("are my literal");
}
那么这将是 Java 不支持的方法文字。