在 Javascript 里函数是一等公民,这意味着函数是一个特殊的对象类型,可以做对象能做的所有事情。
真的就像其他任何变量一样
下面是一些函数能做的重要的对象特性
函数 instanceof 返回 Object 类型
function feedCat(){
alert("Kibble, tinned food and water");
}
alert(feedCat instanceof Object);
函数有原型属性和链接他的构造方法
feedCat.food = "kibble";
alert(feedCat.food);
alert(feedCat.constructor);
你可以把函数存在一个变量里
function feedCat(){
alert("Kibble, tinned food and water");
}
var eveningChore = feedCat;eveningChore();
你可以把函数当做一个参数传递给另一个函数
function doEveningChores(chores){
for(var x=0; x<chores .length; x++)
chores[x]();
}
doEveningChores([feedCat]);
你可以从函数里返回一个函数
function tonightChores(){
return feedCat;
}
var tonight = tonightChores();
tonight();
能够减少重复的代码
能够通过逻辑绕过一个函数表单的应用意味着它可能有会移动更多重复的代码进入函数库里。它可以更容易地从常用逻辑里分离独特逻辑。
举个例子,假设你有一堆巧克力棒,你想找出所有 Mars(火星) 牌子的巧克力因为你喜欢 M&MS 同时你也想找出其他你能够享受的巧克力(我一直在节食7个月了….)。
你可以写一个循环遍历完整的巧克力列表,对应的排序选择逻辑是这样的:
var chocolateBars = [
{name: "Galaxy", manufacturer: "Mars"},
…];
var marsChocolate = [];
for(var x=0; x<chocolatebars .length; x++){
if(chocolateBars[x].manufacturer == "Mars")
marsChocolate.push(chocolateBars[x]);
}
真棒!问题就解决了。在你这个程序应用里只有在圣诞节的时候,你要对你这堆巧克力进行从 naughtyList 到 niceList 排序。在每年的这个时候你总是那么忙!加上你在学校学的程序 ,你没必要把同样的东西写两次。
这听起来像是一个函数库的工作,让我们分开来看吧:
var array_helper = {
filter: function(list, filter)
{
var matches = [];
for(var x=0; x<list .length; x++)
{
if(filter(list[x]))
matches.push(list[x]);
}
return matches;
}
};
var marsChocolate = array_helper.filter(chocolateBars,
function(item) { return item.manufacturer == "Mars"
});
var naughtyList = array_helper.filter(childrenOfTheWorld,
function(item) { return item.naughtiness > 50;
});
var niceList = array_helper.filter(childrenOfTheWorld,
function(item) { return item.naughtiness <= 50;
});
现在,实际上需要为每个需要过滤(filtering)列表编写的代码是非常简单的。如果在这个逻辑有问题它会死的很容易被发现。与函数库逻辑的任何问题都可以在代码里的某个地方修复。再加上你可以随时得到你想要的美味蛋糕随以及世界的好孩子都会在圣诞节的时候得到他们的礼物(这句话啥意思?)。
这个 filter function 是如此的有用以至于它也和JavaScript 库像jQuery和Dojo 一样流行。它也将被包含在浏览器的Javascript1.6的标准部分。但同样的想法可以在很多不同的地方被应用,以减少重复的代码,这不是真正让它变得重型。
方法的本质是包含函数
JavaScript里对象的方法没有什么特别的。它们只是碰巧包含一个函数,而不是像一个字符串或数值属性:
var sabby = {
name : "Sabby",
species: "cat",
hello : function() { alert("hissss"); }
};
这是相当聪明的 JavaScript 语言设计师,因为这意味着他们并不需要做什么特别的支持对象的方法。这就是为什么JavaScript可以有对象,而无需类的部分原因。
让 JavaScript 更灵活动态
很多 JavaScript 的灵活性来自于把函数作为第一等公民。几乎每一篇讲 JavaScript 对象的文章都会把函数当做一个普通的对象。
大部分 JavaScript 中使用对象的基本技术都依赖于这样一件事,简单对象,构造函数和原型都涉及分配方法的对象的属性。
它还可以让 JavaScript 更灵活轻便。从其他语言,如命名空间,自定义事件,静态方法和扩展方法有用的想法都可以被模拟,因为它可以创建一个函数,并把它放在你需要的地方。
延伸阅读
最好的参考,我可以找到,这是有关功能的JavaScript的文章。它解释了函数式语言的功能,JavaScript有一个堆。 这是我能找到有关 JavaScript function 最好的参考文章。它解释了一大堆 javascript拥有的函数语言的功能。
Raganwald 有一些关于为什么像这样的技术是非常有用的信息的一篇有趣的文章。它比较的是 Ruby 和Java,但逻辑仍然适用于JavaScript。
原文:http://helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/
这篇文章感觉翻译成中文好别扭,还是自己的英语渣,毕竟蓝翔主要学习挖掘机,这里推荐另一篇相同主题的文章 https://software.intel.com/zh-cn/articles/javascript-first-class-citizen-function