什么是[url=javascript:;]函数[/url] 式编程?在数学领域,函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个集合里的唯一元素。函数是将唯一的输出值赋予每一输入的“ 法则”。这一“法则”可以用函数表达式、数学关系,或者一个将输入值与输出值对应列出的简单表格来表示。函数最重要的性质是其决定性,即同一输入总是对应同一输出(注意,反之未必成立)。从这种视角,可以将函数看做“机器”或者“黑盒”,它将有效的输入值变换为唯一的输出值。通常将输入值称做函数的参数,将输出值称做函数的值。
《Why Functional Programming Matters》的作者John Hughes 说明了模块化是成功编程的关键,而函数编程可以极大地改进模块化。在函数编程中,编程人员有一个天然[url=javascript:;]框架[/url]用来开发更精练的、更小的、更简单的和更一般化的模块,然后将它们组合在一起。函数式编程的基本特点是:
? 丰富的数据类型;
? 函数是运算元;
? 在函数内保存数据;
? 函数内的运算对函数外无副作用。
函数式编程只描述在程序输入上执行的操作,不必使用临时变量保存中间结果。重点是捕捉“是什么以及为什么”,而不是“如何做”。与将重点放在执行连续命令上的过程性编程相比,函数式编程的重点是函数的定义而不是状态机(State Machine)的实现。是一种强调表达式的计算而非命令的执行的一种编程风格。表达式是用函数结合基本值构成的,它类似于用参数调用函数(函数式的优美的说明可见《Functional Programming For The Rest of Us》)。
JavaScript为什么要使用函数式编程的方式呢?其实无论是[url=javascript:;]面向对象[/url]还是面向过程,我们都需要简单、高效,同时又维护性强、可复用的实现。而JavaScript某些特征恰好迎合了这一需求。
在考虑如何使用JavaScript实现函数式编程前,我们首先要理解以下两个知识点:
1.JavaScript中函数、[url=javascript:;]方法[/url]的调用方法
在JavaScript中,有两种调用函数的方式。一般的方式是把参数放在括号中,另一种方式是同时把函数和参数都放在括号中。如:
function test(x)
{
alert(x);
}
test("hello");
(test)("hello word");
我们知道[url=javascript:;]代码[/url]中括号处理的优先级,JavaScript中计算括号所包含的表达式将返回一个值或者一个函数。正由于操作符“()”可以返回一个函数,为JavaScript实现函数式编程提供了先决条件。
2.匿名函数
匿名函数即没有名字的函数或方法,我们在前面的例子中已经见过。匿名函数可以认为是一次性函数。当你只需要用一次某个函数式时,它们就特别有用。通过使用匿名函数,由于没有相关的引用及标识,执行后就会被垃圾回收,所以使用匿名函数更有效率。下面简单地比较一下匿名函数与其他有引用或标识函数:
function test(x)
{
alert(“定义一个函数标识”);
}
var test = function(){alert(“将一个匿名函数,指向一个引用”)};
(function(){alert(“我是一个匿名函数”)})();
大多数语言都支持将函数作为运算元(参数)参与运算。不过由于对函数的定位不同,因此它们的运算结果也不一样。当JavaScript中的函数作为参数时,是通过引用传递的。“函数参数”与普通参数并没有什么不同,其结果都返回唯一的值。
function test( func )
{
alert(func);
}
teset( (function(){return “匿名函数作为参数”})())
函数式编程的每个变量都是临时产生的。或者可以这么认为:在函数式中没有变量这个概念,任何数据都是根据实际需要,按一定的规则(函数)计算后得到的,这也从一定程度上解决了原子变量并发访问的问题。
好好学习,天天向上!