Functional Programing 函数式编程
immediately-invoked function expression 立即调用函数表达式 / 自执行匿名函数
返回一个id,作为下次关闭该函数的参数,例如setTimeout()\setInterval\requestAnimationFrame()
var loader = setTimeout ( function ( ) { } ) ;
clearTimeout ( loader ) ;
var arr = [
{
id : 2 ,
stage : 2 ,
value : 0 ,
} ,
{
id : 3 ,
stage : 0 ,
value : 1 ,
} ,
{
id : 1 ,
stage : 1 ,
value : 0 ,
} ,
]
// 要求:优先按照stage排序,顺序为 stage=1>0>2 ,如果stage都为0时,value不为0的排在前边;
// 错误的版本 (这个错误的版本在某些机型是能够返回要求的效果的,但并不能蒙蔽,比如这段代码我在PC上测试能够满足要求,在iphone5s ios8.3中则没有满足要求)
arr . sort ( function ( a , b ) {
if ( b . stage === 0 && a . stage === 0 && ! a . value && b . value ) {
return 1 ;
}
return stageRanking [ b . stage ] - stageRanking [ a . stage ] ;
} ) ;
// 正确的版本
arr . sort ( function ( a , b ) {
if ( b . stage === 0 && a . stage === 0 ) {
return computePara ( b . schedule_value ) - computePara ( a . schedule_value ) ;
}
return stageRanking [ b . stage ] - stageRanking [ a . stage ] ;
} ) ;
var stageRanking = {
0 : 1 ,
1 : 2 ,
2 : 0
} ;
function computePara ( para ) {
if ( ! para ) return 0 ;
return 1 ;
}
原因解析:sort传入的a和b并不一定是先后的关系,所以在排序的时候一定不能把逻辑建立在a和b的前后关系上,而是抛开所有前后关系,建立一个“我给你两个参数,你告诉我谁在前边的通用的公式”即可,而不关心这个参数是从哪来的