闭包和toString方法的使用

今天,有个同学问我一个问题:

add(1)  //1

add(1)(2) //3

add(1)(2)(3) //返回6

....

我想了半天,实在想不出来,在我看来, 这是矛盾的,

因为通过add(1)(2)返回3,要求add(1)的返回值是一个函数,才能接收参数2,但是add(1)却是1,不管是字符串还是数字,这都是不可能的。

后来看了答案,才恍然大悟,原来这打印出来的函数的执行结果,必须调用toString方法。

 1 function demo(...args) {
 2             var adds = args.reduce((prev, next) => prev + next, 0);//第一次执行时候才会执行, 其他时候不执行
 3             function fn(...arguments) {//第一次的执行结果,以后都是该函数执行
 4 
 5                 adds = arguments.reduce((prev, next) => prev + next, adds)
 6                 return fn;
 7             }
 8             fn.toString = function () {//最让我想不明白的就是这个地方,一旦打印fn(因为函数连锁调用的结果是fn),则调用它的toString方法。
 9                 return adds;
10             }
11             return fn;//第一次执行时才会执行,以后的所有执行都是执行fn函数;
12         }

 

第二个同学问我的问题是:如何用最简单的代码实现快速排序;

快速排序的思想是:对一组数字,进行两步走:先找出参照物(通常是第一个),其次遍历这组数,比参照物大的放右面,比参照物小的放左边, 然后递归对左右快速排序。代码实现如下:

 1   var arr = [5, 2, 6, 4, 3, 8, 7, 1];
 2         function sort(arr) {
 3             // 出口是只有一个数,不需要排序, 则直接返回该数组
 4             if (arr.length < 2) return arr;
 5             var leader = arr[0];//选出参照物(首领)
 6             var left = [],
 7                 right = [];
 8             for (var i = 1; i < arr.length; i++) {//从第一个开始遍历,而不是第0个
 9                 if (arr[i] > leader) {
10                     right.push(arr[i]);
11                 } else {
12                     left.push(arr[i])
13                 }
14             }
15             return sort(left).concat(leader).concat(sort(right))//递归遍历左右两个数组
16         }
17         console.log(sort(arr));

 

posted @ 2021-04-07 17:00  当当和瓶瓶  阅读(124)  评论(0编辑  收藏  举报