首页 > JS递归中的this是谁?

JS递归中的this是谁?

犀牛书中8.3.4节最后一个例子

function flexisum(a){
  var total=0;
  for(var i=0;i<arguments;i++){
    var ele = arguments[i],n;
    if(Array. isArray(ele)) n= flexisum.apply(this, ele);
    total += n;
  }
  return total;
}

为什么要这么写呢?

n= flexisum.apply(this, ele);

this应该指向window吧。请大牛们帮忙解答疑惑,我是初学者,对JS递归掌握不太好。谢谢了。


谢谢回答的各位朋友,我明白了为什么要用 flexisum.apply(this,ele)
因为如果将flexisum赋值给对象的方法,那么对象调用此方法时,会把flexisum的this指向该对象。
比如:var o = {}; o.f = flexisum; o.f(/* */); 此时flexisum的this指向 o 。

另外,主要疑问:n= flexisum.apply(this,ele); 为什么不能简写成 n=flexisum(ele);是因为前面判断ele是数组,apply调用则是将ele每个元素作为实参传递给flexisum,而 n=flexisum(ele); 还是把ele这个数组传递给了flexisum,造成无限递归,导致栈溢出。

我忽视了apply会将ele这个数组的每个元素都单独处理。

感谢各位朋友的回答,谢谢。


n= flexisum.call(this, ele)作用是:将当前的this传递给了下一轮被调用的flexisum,从而使所有flexisum中的this与首次被调用时的this保持一致。

所以,目的就是:

为了保证n次调用中this一致。

假设你首次调用是这样的:

flexisum(...);

那么n次递归中,this都是window(或undefined)。

假设你首次调用是这样的:

sth.flexisum(...);
flexisum.call(sth, ...);

那么n次递归中,this都是sth。


取决于 flexisum 所属对象,你说 window 是没错,在这个代码片段来看,这是一个全局函数。但如果是 aClass.flexisum 的话,this 即 aClass 对象。
ps:+= n 这里是个bug

【热门文章】
【热门文章】