zoukankan      html  css  js  c++  java
  • 闭包和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));
  • 相关阅读:
    正则表达式
    c#文件流
    css
    Flash笔记 快捷键
    .Net截取指定长度的汉字,其余用...表示的方法
    远程修改最新消息管理系统(JQuery版)
    远程修改最新消息管理系统
    kubernetes 1.6 集群实践 (一)
    创建kafak集群
    创建zookeeper集群
  • 原文地址:https://www.cnblogs.com/dangdanghepingping/p/14628551.html
Copyright © 2011-2022 走看看