• 函数还能这样玩儿~实现类似add(1)(2)(3)的函数


    人生的第一份前端工作找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔。

    ​ 分享一个准备面试时遇到的一个有趣的问题:

    要求实现类似add(1)(2)(3)调用方式的方法,例如add为加法函数,则调用add(1)(2) 输出3,调用add(1)(5)(3)输出9。

    ​ 函数的调用方式是多次调用同一个函数,将每次传入的参数累加,多次函数运算过程中需要记录之前累加的值。很容易让我们联想到闭包,如果调用次数是固定的,我们可以这样来完成:

    var add = function(a) {
      return function(b) {
      	return function(c) {
      			return a + b + c;
    		};
    	};
    };
    
    add(1)(2)(3);   //6
    

    ​ 可以看到运用闭包可以依次获取三次调用的参数,最终返回相加的结果。但如果要调用四次,这个函数就不适用了。如题目要求的不限次数调用,我们是不是可以让闭包函数返回自身来实现呢?如下:

    var add = function(a) {
      var sum = a ;
      var addMore = function(b) {
      	sum += b;
      	return addMore;   //addMore函数每次累加后返回自身,继续累加后面的执行参数。
      };
      return addMore;     //获取第一个参数赋值给sum后,返回addMore函数。
    }
    

    ​ 理论上这样就解决问题了,但在调试中我们会发现,当函数调用完毕后,输出的结果并不是sum,而是addMore函数,因为我们每次调用后都return函数自身。那现在需要解决的问题就是如何让函数输出sum值。

    ​ 在网上搜索答案后发现解决方法是:

    首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,所以我们重写tmp的toString和valueOf方法,返回sum的值;

    addMore.toString = function() {
      return sum;
    };
    

    ​ 如上解决方法是改写addMore闭包函数的toString方法,返回sum值。全部代码如下:

    var add = function(a) {
    	var sum = a;
    	var addMore = function(b) {
    		sum += b;
    		return addMore;
    	};
    
    	addMore.toString = function() {
    		return sum;
    	};
    
    	return addMore;
    };
    
    add(1)(2)(3)(4);      //function 10
    var a = add(1)(2)(3)(4).toString();  //10
    

    ​ 如上代码的倒数第二行,函数最终返回的值会包含一个function前缀(暂时没有找到原因,是浏览器给出的提示么?请各位大神指导*0 *);结果再运用toString()函数就可以返回正确的数值。

  • 相关阅读:
    Higher-Order Functions and Lambdas
    dispatch_sync:As an optimization, this function invokes the block on the current thread when possible
    为什么使用dispatch_sync
    如何安全使用dispatch_sync
    dispatch_sync
    Dispatch Queues and Thread Safety
    高阶函数-参数与返回值
    In Swift, typedef is called typealias:
    偏函数应用(Partial Application)和函数柯里化(Currying)
    Centos下添加用户到用户组
  • 原文地址:https://www.cnblogs.com/daisykoo/p/5569619.html
Copyright © 2020-2023  润新知