javascript - 求教一道没写出来的JS面试题。
PHPz
PHPz 2017-04-11 11:37:59
[JavaScript讨论组]

编写一个对参数进行加法运算的CISDI_Cal函数
函数使用方法:

CISDI_Cal (0).toString() //输出0
CISDI_Cal (0)(1).toString() //输出1 
CISDI_Cal (0)(1)(2).toString() //输出3
var v = CISDI_Cal (0)(1) ; v(2).toString() //输出3
PHPz
PHPz

学习是最好的投资!

全部回复(7)
ringa_lee
function CISDI_Cal(n){
  var fn = function(x) {
    return CISDI_Cal(n + x);
  };
  
  fn.toString = function() {
    return n;
  };
  
  return fn;
}
伊谢尔伦

这道题考察的是JavaScript里面常用的函数闭包.

从前面三个示例与最后一个示例的对比可以知道:

  1. CISDI_Cal(x);返回的是一个JavaScript函数对象, 因为示例4的v可以作为函数调用:v(2);

  2. CISDI_Cal(y).toString()返回累加到y的结果. 也就是说, 返回的函数对象是带有toString方法的.

function CISDI_Cal(x) {
  // codes for 1.
  function addMore(y) {
    // 因为示例中可以累加, 所以如果有更进一步的调用,
    // 那么用x封存已经累加的状态, 返回累加后的`addMore`函数
    x += y;
    return arguments.callee;
  }
  
  // codes for 2.
  // 调用toString方法的时候, 返回累加到当前的总数.
  addMore.toString = function () {
    return x;
  }
  
  return addMore;
}
ringa_lee

这个题用高阶函数即可。

function CISDI_Cal(number1) {

  function plus(number2) {
    number1 += number2;
    return plus;
  }

  plus.toString = function() {
    return number1;
  }
  
  return plus;
}
黄舟

这题考查的是柯里化

ringa_lee
function CISDI_Cal(x){

    function add(y){
      x += y;
      return arguments.callee;
    }
    add.toString = function(){
      //console.log(x);
      return x;
    }
    return add;
  }
黄舟
function CISDI_Cal(num){
    CISDI_Cal.prototype.sum += num;
    return CISDI_Cal;
}

CISDI_Cal.prototype.sum = 0;

CISDI_Cal.toString = function(){
    return CISDI_Cal.prototype.sum.toString();
}
天蓬老师
function CISDI_Cal(m){
    var _n=0;
    var fn = function(m){
        _n += m;
        return fn;
    }
    fn.toString = function(){
        return _n;
    }
    return fn;
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号