在学习js函数这块时遇到了一个讲函数作为返回值的例子,这个例子最后是将这个返回值作为参数传给sort()函数来执行的,其实之前也遇见过sort()函数用函数做形参,只是当时没有在意,今天又遇到了,所以想把它弄明白......
sort()函数在w3school的教程入门上已经明确的说明了它可以有一个形参,并且如果有参数那么这个参数一定是一个函数,而且还给了相应的例子:
定义和用法 sort() 方法用于对数组的元素进行排序。 语法 arrayObject.sort(sortby) 参数 描述 sortby 可选。规定排序顺序。必须是函数。
排序不正确的例子:
<script type="text/javascript"> var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25" arr[4] = "1000" arr[5] = "1" document.write(arr + "<br />") document.write(arr.sort()) </script> 输出: 10,5,40,25,1000,1 1,10,1000,25,40,5
排序正确的例子:
<script type="text/javascript"> function sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25" arr[4] = "1000" arr[5] = "1" document.write(arr + "<br />") document.write(arr.sort(sortNumber)) </script> 输出: 10,5,40,25,1000,1 1,5,10,25,40,1000
当看到这时我之前的疑惑就是,哪里的数值来给sortNumber函数传参?而sortNumber函数的返回值是如何影响sort函数的?
其实知乎上的大佬已经用通俗易懂的代码解释过了:
想真正的看懂这个函数形参还是应该看看V8关于数组排序这块的源代码(也是js的代码):
function InsertionSort(a, from, to) { for (var i = from + 1; i < to; i++) { var element = a[i]; for (var j = i - 1; j >= from; j--) { var tmp = a[j]; var order = comparefn(tmp, element); if (order > 0) { a[j + 1] = tmp; } else { break; } } a[j + 1] = element; } };
这段js代码是V8上的插入排序的代码(在V8中数组长度小于10的排序使用该方法),其中那个comparefn函数就是你传进来的sort函数的形参(函数),由这段代码可以看出sort函数的形参函数的形参(也就是上文的sortNumber函数的参数)是在函数实现中把数组中的两个数穿进去;而返回值(上文的sortNumber函数的返回值)的作用就是为了告诉sort函数你想怎样对这两个数排序,然后sort函数根据这个返回信息来进行操作数组。