求教一道没写出来的JS面试题。

编写一个对参数进行加法运算的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
阅读 5.1k
8 个回答
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;
}

这个题用高阶函数即可。

function CISDI_Cal(number1) {

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

  plus.toString = function() {
    return number1;
  }
  
  return plus;
}
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(m){
    var _n=0;
    var fn = function(m){
        _n += m;
        return fn;
    }
    fn.toString = function(){
        return _n;
    }
    return fn;
}
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(x) {
    var fn = function(y) {
    return CISDI_Cal(x + y);
    };
    fn.toString = function() {
    return x;
    };
    return fn;
};
推荐问题
宣传栏