我刚刚开始阅读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这样的函数式编程语言,从概念上讲,除函数之外,没有其他类型的对象。

10-07 19:48
查看更多