我刚刚开始阅读JavaScript:权威指南,但我不明白作者说的是什么意思:
“关于JavaScript函数的最重要的事情是它们是真实值,并且JavaScript程序可以将它们视为常规对象。”
他是什么意思,它们是“真实值(value)”?为什么这意味着它们可以像对象一样对待?
最佳答案
这意味着您可以存储,读取和调用诸如对象之类的函数。因此,他们将函数称为“一流的公民”:数据和函数之间没有区别对待(至少在概念上没有区别,显然运行时环境可以不同地实现它)。在大多数静态类型的面向对象的语言(如Java的旧版本)中,这无法(轻松地)完成。您可以将函数作为参数传递,将函数保存在对象中,甚至(这使JavaScript非常特殊)也可以打印函数的实现。
例子
将它们作为参数传递:
您可以将一个函数作为参数传递给(例如)另一个函数:
function foo (f,x) {
return f(x); //calling f, thus f is a parameter and can be called
}
这里
f
是那个函数。存储它们:
您可以将函数存储在变量中:
var f = function (x) { return x+2 };
现在您可以调用
f(2)
来接收4
。打印功能:
您可以使用
.toString
方法获取自实现函数的签名和实现。例如,使用node
:> console.log(f.toString());
function (x) { return x+2 }
(显然,上面列出的示例非常简单,没有多大意义,但是可以想象,例如
f
将更新网页上的文本字段,或者执行复杂的查询,...)。希望您能体会到这一点的力量。其他编程语言
尤其是对于Java的旧版本,您无法做到这一点。例如一段代码:
//This is Java code to make an analogy
public class Foo {
public static int Bar (int x) {
return x+2;
}
}
您无法将
Foo.Bar
存储到变量中,无法将函数传递给另一种方法,...大多数(面向对象的)编程语言曾经清楚地区分了数据和函数。显然,处理数据或函数的相同或不同有优缺点,尽管通过看一下编程语言的演变,我想说,对它们进行相同的对待似乎是社区发展的方向(很明显,不是每个人,而这只是个人陈述)。绝对将函数视为一流公民的编程语言是像Haskell这样的函数式编程语言,从概念上讲,除函数之外,没有其他类型的对象。