功能是真正的价值观?

时间:2015-11-25 15:25:11

标签: javascript function object

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

时的含义

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

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

3 个答案:

答案 0 :(得分:6)

这意味着JavaScript不会区分函数或字符串,数字或布尔值,只要它们与它们完全相同。

他们是所有对象。

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

一样
"neilmunro".length;

将是9。

function sayHi() { console.log("Hi"); }
sayHi.name;

将打印出来" sayHi"。

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

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

doSomething("Neil", function() { console.log("You're a human!"); });

有点心灵弯曲,除此之外还有更多,但它是基本的想法。

答案 1 :(得分:5)

这意味着您可以存储,读取和调用对象等函数。因此,他们称函数"一等公民" :数据和函数之间没有不同的处理方式(至少在概念层面上没有,显然运行时环境可以以不同的方式实现它)。在大多数静态类型的面向对象语言中,比如旧版本的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 ,其中 - 从概念上讲 - 没有其他类型的对象而不是函数。

答案 2 :(得分:1)

我相信这意味着您可以使用与任何其他对象,整数,字符串或其他内容相同的方式分配或传递函数。

例如

var foo = 1; // integer
var foo = 'bar'; // string
var foo = false; // boolean
var foo = {value: 'bar'}; // object
var foo = function bar() {}; // function

无论它们是字符串,函数还是对象,它们都可以分配给变量或传递给函数。他们都是真正的价值观#34;。