不推荐被使用的arguments.callee

arguments对象

arguments对象是一个特殊的类数组对象(不是数组),它代表传给一个函数的参数列表。arguments对象是函数内部的本地变量,并非函数的属性。

我们可以通过数组下标的形式来访问具体的参数。

arguments[0];
arguments[1];
arguments[2];

参数也可以被重新赋值:(但是我们不推荐这种做法)

arguments[1]="value";

因为arguments对象并不是一个真正的数组,所以它不能使用数组所特有的属性和方法,但它拥有length属性。但是我们可以将其转换为数组:

var args=Array.prototype.slice.call(arguments);
//另外一种写法
var args=[].slice.call(arguments);

 

arguments.callee

callee是arguments对象的属性。在函数体内,它指向当前正在执行的函数。

ECMAScript 5 禁止在严格模式中使用 arguments.callee()。当一个函数必须调用自身的时候,假如它是函数表达式则给它命名,或者使用函数声明,避免使用 arguments.callee()

使用arguments.callee最常见的情景是当我们要创造一个递归函数的时候:

(function(n){
  return !(n>1)?1:arguments.callee(n-1)*n;
}).call(this,5);
//120

但是如果我们写成:

(function(n){
  return !(n>1)?1:(n-1)*n;
}).call(this,5);
//20

为了解决这个问题,我们才使用了arguments.callee

实际上这是一个糟糕的解决方案,因为递归调用会获取到不同的this值:

var global=this;
var badRecursive=function(r){
  if(!r){return arguments.callee(true);}
  if(this!==global){
    alert("This is:"+this);
  }else{
    alert("This is global");
  }
}
badRecursive(true);//"This is global"
badRecursive(false);//"This is[object Arguments]"

因此用命名函数表达式可以解决这些问题,例如:

[1,2,3].map(function recursive(n){
  return !(n>1)?1:recursive(n-1)*n;
});

 

转载于:https://my.oschina.net/JSBreaker/blog/778887

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值