js:语言精髓笔记9--函数式语言特征
2014-11-09 20:00
316 查看
形式化运算系统的研究:
图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题;
冯诺依曼:提出了冯诺依曼体系;即通过修改内存反映运算结果;
阿隆左.丘奇:提出新的运算范型Lambda演算,计算机运算才是本质,修改内存只不过是这种运算规则的副作用;
后出现函数式语言的鼻祖:LISP;
函数式语言:
通过连续表达式运算求值的语言;
由于现在的计算机都是基于冯诺依曼体系建立的,所以函数式语言就是运行在解释环境而非编译环境的;
结果:大多数人都在使用基于冯诺依曼体系的命令式语言,但为了获得特别的计算能力或者编程特征,这些语言也在逻辑层实现一种适宜于函数式语言范式的环境。一方面产生了如JS这样多范式语言,另一方面产生了如.NET,JVM的能够进行某些函数式计算的虚拟机环境;
函数式语言中的函数(性质):
能被调用;
函数是运算元:js中将函数当参数时,传递引用但并没有地址概念,因此与普通参数并没有不同;
在函数内保存数据:
在命令式语言中,函数内部的私有变量是不能被保存的;因为局部变量在栈上分配,函数结束后所占用的栈会被释放;
在js的函数中,函数内的私有变量可以被修改,而且当再次进入到该函数内部时,这个被修改的状态仍将持续;
在函数内保持数据的特性被称为闭包;
函数内的运算对函数外无副作用:(依赖开发人员的编程习惯)
作为值参数而不是变量参数使用;
不修改函数外部的其他数据;
运算结束通过函数返回向外部系统传值;
//不修改全局变量,且不在函数内修改对象和数组成员;这些成员应该由对象方法而非对象系统外的其他函数来修改;这里可以综合考虑对象系统的接口特性;
从运算式语言到函数式语言:
JS中几种连续运算:
连续赋值;
三元表达式(推荐连用);
连续的逻辑运算;
链式运算;
运算式语言:因为运算都是产生值类型的结果,且所有的逻辑语句结构都可以被消灭;所以系统的结果必然是值,并且可以通过一些列的运算来得到这一结果;
消灭语句:
分支语句
循环语句
//循环语句良好的特性就是开销小;函数递归中,由于需要每次函数调用保留私有数据和上下文环境,所以将消耗大量栈空间,可能造成栈溢出;尾递归(即在执行序列的最后一个表达式中出现递归调用)可以消除这种情况,但JS解释环境不支持这种特性;
函数式语言:
函数:本质上来讲,函数式语言中的函数应该是‘lambda(函数)’,而不是一般提及的function;
概括JS满足函数式语言的特性:
在函数外消除语句,只使用表达式和函数,通过连续求值来组织代码;
在值概念上,函数可以作为运算元参与表达式运算;
在逻辑概念上,函数等义于表达式运算符,其参数是运算元,返回运算结果;
函数严格强调无副作用;
JS中的函数:
可变参数与值传递:
JS特点
从左至右传入参数;
传入参数的引用,函数内对它的任何修改都不会被传出;
传入参数的个数是可变的; //所以很多情况下需要arguments;
非惰性求值; //对函数来说,如果一个参数是需要用到时才会完成求值,就是惰性求值,而JS的函数是非惰性求值
函数是第一型的; //由于此特征,JS函数即可以做运算元,也可以做运算符;
函数是一个值; //基于对象来讲,JS中所有东西都是对象;函数式语言来讲,所有东西都是值;
可遍历的调用栈:
//一个静态未调用的函数只是一个值,当它(F)调用时,系统将正在运行的函数(A)入栈,并保留函数A的执行指针;在函数F执行完之后,函数A出栈并继续执行指针后的代码;
callee: //arguments.callee;
总是指向arguments创建的函数;
对于匿名函数和函数重写的特性的有意义;
caller: //Function.caller;
总是执行调用这个函数的函数;
如果多个函数都调用这个函数,那么JS会无法识别并导致出错;所以ECMA标准并不提倡使用;
图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题;
冯诺依曼:提出了冯诺依曼体系;即通过修改内存反映运算结果;
阿隆左.丘奇:提出新的运算范型Lambda演算,计算机运算才是本质,修改内存只不过是这种运算规则的副作用;
后出现函数式语言的鼻祖:LISP;
函数式语言:
通过连续表达式运算求值的语言;
由于现在的计算机都是基于冯诺依曼体系建立的,所以函数式语言就是运行在解释环境而非编译环境的;
结果:大多数人都在使用基于冯诺依曼体系的命令式语言,但为了获得特别的计算能力或者编程特征,这些语言也在逻辑层实现一种适宜于函数式语言范式的环境。一方面产生了如JS这样多范式语言,另一方面产生了如.NET,JVM的能够进行某些函数式计算的虚拟机环境;
函数式语言中的函数(性质):
能被调用;
函数是运算元:js中将函数当参数时,传递引用但并没有地址概念,因此与普通参数并没有不同;
在函数内保存数据:
在命令式语言中,函数内部的私有变量是不能被保存的;因为局部变量在栈上分配,函数结束后所占用的栈会被释放;
在js的函数中,函数内的私有变量可以被修改,而且当再次进入到该函数内部时,这个被修改的状态仍将持续;
在函数内保持数据的特性被称为闭包;
函数内的运算对函数外无副作用:(依赖开发人员的编程习惯)
作为值参数而不是变量参数使用;
不修改函数外部的其他数据;
运算结束通过函数返回向外部系统传值;
//不修改全局变量,且不在函数内修改对象和数组成员;这些成员应该由对象方法而非对象系统外的其他函数来修改;这里可以综合考虑对象系统的接口特性;
从运算式语言到函数式语言:
JS中几种连续运算:
连续赋值;
三元表达式(推荐连用);
连续的逻辑运算;
链式运算;
运算式语言:因为运算都是产生值类型的结果,且所有的逻辑语句结构都可以被消灭;所以系统的结果必然是值,并且可以通过一些列的运算来得到这一结果;
消灭语句:
分支语句
if(tag > 1) { console.log('true'); } (tag > 1) && console.log('true'); (tag > 1) ? console.log('true') : null; ---------------- if(tag > 1) { console.log('true'); } else { console.log('false'); } (tag > 1) ? console.log('true') : console.log('false'); ---------------- switch(value) { case 100: case 200: console.log('100~200'); break; case 300: console.log('300'); break; default: console.log('default'); } (value == 100 || value == 200) ? console.log('100~200') : (value == 300) ? console.log('300') : console.log('default');
循环语句
var i = 100; do { //do something i--; }while(i > 0); /**/ function foo(i) { //do something if( --i > 0) foo(i); } foo(i); /*better*/ void function(i) { //do something (--i > 0) && arguments.callee(i); }(i);
//循环语句良好的特性就是开销小;函数递归中,由于需要每次函数调用保留私有数据和上下文环境,所以将消耗大量栈空间,可能造成栈溢出;尾递归(即在执行序列的最后一个表达式中出现递归调用)可以消除这种情况,但JS解释环境不支持这种特性;
函数式语言:
函数:本质上来讲,函数式语言中的函数应该是‘lambda(函数)’,而不是一般提及的function;
概括JS满足函数式语言的特性:
在函数外消除语句,只使用表达式和函数,通过连续求值来组织代码;
在值概念上,函数可以作为运算元参与表达式运算;
在逻辑概念上,函数等义于表达式运算符,其参数是运算元,返回运算结果;
函数严格强调无副作用;
JS中的函数:
可变参数与值传递:
JS特点
从左至右传入参数;
传入参数的引用,函数内对它的任何修改都不会被传出;
传入参数的个数是可变的; //所以很多情况下需要arguments;
非惰性求值; //对函数来说,如果一个参数是需要用到时才会完成求值,就是惰性求值,而JS的函数是非惰性求值
函数是第一型的; //由于此特征,JS函数即可以做运算元,也可以做运算符;
函数是一个值; //基于对象来讲,JS中所有东西都是对象;函数式语言来讲,所有东西都是值;
可遍历的调用栈:
//一个静态未调用的函数只是一个值,当它(F)调用时,系统将正在运行的函数(A)入栈,并保留函数A的执行指针;在函数F执行完之后,函数A出栈并继续执行指针后的代码;
function F() { } function A() { F(x,y,z); }
callee: //arguments.callee;
总是指向arguments创建的函数;
对于匿名函数和函数重写的特性的有意义;
caller: //Function.caller;
总是执行调用这个函数的函数;
如果多个函数都调用这个函数,那么JS会无法识别并导致出错;所以ECMA标准并不提倡使用;
相关文章推荐
- js:语言精髓笔记12--动态语言特性(2)
- js:语言精髓笔记1--标识符与基本类型
- js:语言精髓笔记10--闭包
- js:语言精髓笔记5----语言分类
- [1009]JS语言精髓与编程实践笔记1
- js:语言精髓笔记3----语句
- js:语言精髓笔记13--语言技巧
- js:语言精髓笔记7----原型继承
- js:语言精髓笔记6----作用域
- js:语言精髓笔记8--对象系统
- js:语言精髓笔记4----面向对象概要与运算符二义性
- js:语言精髓笔记2--表达式
- js:语言精髓笔记11--动态语言特性(1)
- JS精髓笔记
- JS 语言核心(JavaScript权威指南第六版)(阅读笔记)
- JS语言特征
- 【原生js】js面向对象三大特征之继承笔记
- JS语言精粹学习笔记--对象字面量
- 【原生js】js面向对象三大特征之多态笔记
- 《JavaScript 语言精髓与编程实践》第二章笔记