顺序语句1:
var a=1;
var b=2;
var c=2;
顺序语句消灭1:
var a=1, b=c=2;
顺序语句2:
var a= -1.11;
a=Math.abs(a);
a=Math.round(a);
顺序语句消灭2:
a.wsc(Math.abs).wsc(Math.round);
分支语句1:
if(a==1){b=2;}
分支语句消灭1:
(a==1) && b=2;
抑或
(a==1) ? b=2 :null;//其实if语句的大括号里面,可以throw,可以return,可以多条语句。但三目运算?:不能,可以通过封装个function,然后调用即可。因为函数是对多个表达式运算的封装。表达式运算是求值运算。
分支语句2:
if(a != undefined){
c = a;
}
else if(a == undefined && b !== undefined){
c = b;
}
消灭分支语句2:
var c = a || b;
循环语句1:
for(var i=0;i<10;i++){
alert(i);
}
循环语句消灭1:
void function(i){
var tempArg = arguments;
function temp(){
alert(i);tempArg.callee(++i);
}
(i<10) ? temp() : null;
}(0);
//注意点1,this和arguments都是跟function环境有关,不同function环境,this和arguments的值不同。
//注意点2,普通递归由于把处理结果放在堆栈里,天生的强生的,比处理结果放在固定变量里的for循环慢。但是,用尾递归,把处理结果直接传到下个函数的参数列表里,可以提高递归速度。
//举个例子,for循环,普通递归,尾递归的例子
函数式语言的函数,有三特性。
1.函数是运算元,只能被调用。可以往函数的参数列表里面传入函数,当然传入不了地址。
2.在函数内保存数据。通过闭包啦。
因为闭包,所以同个函数的不同实例有各自的闭包,各自里面的数据不打扰。
3.函数内的运算对函数外无副作用。
函数使用入口参数进行运算,而不修改它(也就是作为值参数)
在运算过程中不会修改函数外部的其他数据的值,比如全局变量。
运算结束后通过函数向外部系统传值。
但是,JavaScript天生能修改全局变量,还能声明全局变量呢。所以要靠我们的习惯来保证。面向对象的世界里,通过读写器访问对象属性,通过接口向外暴露对象方法,套用在函数外无副作用,就很好。
综上所述,当函数只存在值含义,并且没有副作用,函数才能作为表达式运算的运算元才与运算。//可能递归函数,作为for循环,是个例外。给一个确定的唯一外部变量,递归函数只修改它。