我刚刚开始阅读JavaScript:The Definitive Guide并且我不明白作者在他说:
时的含义"关于JavaScript中函数最重要的是它们是真正的值,JavaScript程序可以将它们视为常规对象。"
他是什么意思,他们是"真正的价值观"?为什么这意味着他们可以像对象一样对待?
答案 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;。