zoukankan      html  css  js  c++  java
  • 实现如下语法的功能:var a = add(2)(3)(4); //9

    汤姆大叔的博客里看到了6个基础题目:本篇是第6题 - 实现如下语法的功能:var a = add(2)(3)(4); //9

    解题关键:add()函数需要返回一个加法函数,而不是一个普通的值,即定义add(),并想办法让add()返回一个add()。js最显著的特征就是函数的返回值可以是一个函数。

    实现办法:

    第1步:在add()体内定义一个fn,该fn返回一个add()。add传递第1个加数,fn传递第2个加数,返回add时,将两个加数之和传递给add,这样就实现了累加。

    第2步:定义add()的返回值为fn

    如此一来,就变成了add返回fn,而fn又返回了add,这就是变相的add返回add!如下是代码:

    function add(a) {
        var fn = function(b) {
            return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add,实现累加
        }
        
        return fn;
    }
    var t = add(1)(2);
    console.log( t );

    运行查看,并没有输出我们预期的结果3,而是输出了 fn 这个函数的定义代码。为什么会这样?不用想太多,本身就是这样。因为add返回的是一个函数,并非一个具体的值,所以输出add时,自然就得到了这段定义的代码。那么如何才能得到我们要的那个值呢?

    回看fn函数的定义,它返回的是一个add函数,并将a+b的值作为add的参数,那么时此的add的参数,不正就是累加的总和吗?(请仔细思考)换句话说,就是add中的a,总是保存着累加的和。那我们要如何得到这个值呢?

    js中console.log一个对象时,会对这个对象进行toString()操作,还有些情况会对对象进行valueOf()操作,那么我们只要让fn的toString()和valueOf()返回的是a的值就可以解决问题,代码如下:

    function add(a) {
        var fn = function(b) {
            return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add
        }
        fn.toString = fn.valueOf = function() {
            return a; // 1为什么返回a?   // 2为什么定义fn.toString而不是add.toString?
        }
        return fn;
    }
    var t = add(1)(2);
    console.log( t );

    以上代码中的问题1和问题2请仔细思考,此处不详解!

    本题解答完毕!

  • 相关阅读:
    SSM环境搭建
    spring 开发 Tars
    Tars --- Hello World
    Java IO流
    Java集合
    常用类
    Pwn With longjmp
    格式化字符串漏洞利用实战之 njctf-decoder
    一步一步 Pwn RouterOS之ctf题练手
    srop实战
  • 原文地址:https://www.cnblogs.com/langzs/p/6637703.html
Copyright © 2011-2022 走看看