《JavaScript语言精髓与编程实践》读书笔记之函数式语言特征(未完)
命令式语言,运算一个输入,产生一个输出,输出结果保存在中间变量,为了下一次的运算。
这是因为冯诺依曼体系的CPU有寄存器,运算数要先放到寄存器里。
函数式语言的特征之一就是连续运算。
冯诺依曼体系的运算系统:通过修改内存来反映运算的结果。
我们用计算机的目的是进行运算并产生结果,运算才是本质。(过程才是本质,修改内存只是这个过程的实现手段之一)
函数式语言三特性:函数是运算元,在函数内保存数据,函数内的运算对函数外无副作用。以函数为参数和返回值的函数。
C语言的函数作为参数,实际上是指针,可以对指针赋值,调用,和地址运算。地址运算就有内存溢出危险。
在JavaScript中,函数也是运算元,但它的运算只有调用,没有赋值和地址运算。
在函数内保存数据:
在命令式语言中,函数中的数据是静态数据,函数内部的私有变量保存在栈中,函数执行结束后,所占用的栈被释放。
在JavaScript中,函数内的私有变量可以被修改,并且被修改的数据将持续。在函数内保持数据的特性被称为闭包。
function MyFunc(){
var value= 100;
function set_value(v){
value = v;
}
function get_value(){
return value;
}
set = set_value;
get = get_value;
}
MyFunc();
alert(get());
set(300);
alert(get());
于是,数据存在不同的闭包中,因此不会产生相互影响,也就是说,不同的实例拥有各自的私有变量。
函数内的运算对函数外无副作用:
函数使用入口参数进行运算,而不修改它(作为值参数,而不是引用参数);
在运算过程中不会修改函数外部的其它数据的值,比如全局变量;
运算结束后通过函数返回向外部系统传值。
但是JavaScript语言允许在函数内部引用和修改全局变量,甚至可以声明全局变量。所以保持这个函数式特征,得靠我们的开发习惯:通过接口向外暴露系统,通过读写器方位对象属性。
为什么“连续求值”是函数式语言的基本特征?因为,运算产生结果,结果用于更进一步的运算。函数只是封装运算的一种手段。 所以,精髓不是函数,是运算。
JavaScript中的几种连续运算:连续赋值,三元表达式的连用,运算符连用,函数与方法的连续调用。
运算的实质是值运算,就是说运算产生的结果是值类型,如果是引用类型,也只是为了最后的值类型而引用。于是,我们可以来消灭顺序,分支和循环语句。
通过表达式消灭分支语句:
if(tag > 1){
alert('true');
}
else{
alert("false");
}
//等同于
(tag > 1) ? alert("true") : alert("false");
var value = 4444;
if(value == 100 || value == 200){
alert("value is 100 or 200");
}
else if(value == 300){
alert("value is 300");
}
else{
alert("I don't know.");
}
//等同于
(value == 100 || value == 200 ) ? alert("value is 200 or 100")
: (value == 300) ? alert("value is 300")
: alert("I don't know.");
合乎自然而生生不息。。。