功能是真正的价值观?

Lau*_*Man 6 javascript function object

我刚刚开始阅读JavaScript:The Definitive Guide,我不明白作者在说:

"关于JavaScript中函数最重要的是它们是真正的值,JavaScript程序可以将它们视为常规对象."

他是什么意思,他们是"真正的价值观"?为什么这意味着他们可以像对象一样对待?

Nei*_*nro 6

这意味着JavaScript不会区分函数或字符串,数字或布尔值,只要它们关注它们都是一样的.

他们都是对象.

对象是JS中的键/值对,就像

"neilmunro".length;
Run Code Online (Sandbox Code Playgroud)

将是9.

function sayHi() { console.log("Hi"); }
sayHi.name;
Run Code Online (Sandbox Code Playgroud)

将打印出"sayHi".

函数可以传递给其他函数:

function doSomething(name, func) {
    console.log("Hi: " + name);
    func();
}

doSomething("Neil", function() { console.log("You're a human!"); });
Run Code Online (Sandbox Code Playgroud)

它有点弯曲,而且还有更多的东西,但它是基本的想法.


Wil*_*sem 5

这意味着您可以存储,读取和调用对象等函数.因此,他们称函数为"一等公民":数据和函数之间没有不同的处理方式(至少在概念层面上没有,显然运行时环境可以以不同方式实现它).在大多数静态类型的面向对象语言中,比如旧版本的Java,这是不可能的(很容易).您可以将函数作为参数传递,将函数保存在对象中,甚至(这使得JavaScript非常特殊),打印函数的实现.

例子

将它们作为参数传递:

你可以将函数作为参数传递给(例如)另一个函数:

function foo (f,x) {
    return f(x); //calling f, thus f is a parameter and can be called
}
Run Code Online (Sandbox Code Playgroud)

f是功能.

存储它们:

您可以将函数存储在变量中:

var f = function (x) { return x+2 };
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话f(2)来接收4.

印刷功能:

您可以使用该.toString方法获取自实现函数的签名和实现.例如node:

> console.log(f.toString());
function (x) { return x+2 }
Run Code Online (Sandbox Code Playgroud)

(显然上面列出的例子相当简单并且没有多大意义,但想象一下,f例如,将更新网页上的文本字段,或执行复杂的查询,...).我希望你能体会到这一点的力量.

其他编程语言

特别是对于旧版本的Java,你无法做到这一点.例如,一段代码如:

//This is Java code to make an analogy
public class Foo {

    public static int Bar (int x) {
        return x+2;
    }

}
Run Code Online (Sandbox Code Playgroud)

您无法存储Foo.Bar到变量中,将函数传递给另一个方法,...大多数(面向对象的)编程语言曾经明确区分数据和函数.显然有相同或不同的数据和功能处理的优点和缺点,虽然通过观察编程语言的演变,我会说对待它们似乎是社区发展的方向(显然不是每个人,这个只是个人陈述).

绝对将功能视为一等公民的编程语言是Haskell这样的函数式编程语言 - 从概念上讲 - 没有其他类型的对象而不是函数.