在JavaScript中有对象文字和函数文字。
对象文字:
myObject = {myprop:"myValue"}
功能文字:
myFunction = function() {
alert("hello world");
}
字面文字有什么意义?我们可以说Java有方法文字吗?
public void myMethod() {
System.out.println("are my literal");
}
答案 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");
}
此函数在编译时声明 ,可以在作用域中的任何时间使用。
答案 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不支持的方法文字。