javascript权威指南 - JS递归中的this是谁?

查看:220
本文介绍了javascript权威指南 - 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。

这篇关于javascript权威指南 - JS递归中的this是谁?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆