犀牛书中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