如何使这个javascript工作?

如何使这个javascript工作?,javascript,this,anonymous,Javascript,This,Anonymous,我想做一个递归匿名函数 以下是函数: (function (i) { console.log(i); if (i < 5) this(i + 1) })(0) (功能(i){ 控制台日志(i); 如果(i

我想做一个递归匿名函数

以下是函数:

(function (i) {
    console.log(i);
    if (i < 5) this(i + 1)
})(0)
(功能(i){
控制台日志(i);
如果(i<5)这个(i+1)
})(0)
我知道“this”是窗口对象。是否有方法调用该函数?

可以使用该属性

(function(i){console.log(i);if(i<5)arguments.callee(i+1)})(0)
抛出:

TypeError:“调用方”、“被调用方”和“参数”属性不能在严格模式函数或用于调用它们的参数对象上访问


啊。。。递归的函数形式。。。。[[[闪回到comp sci类]]

您可以使用助手函数:

function X(f) { return f.apply(this, arguments); }
X(function(me, n) { return n<=1 ? n : n*me(me,n-1); }, 6);
(两者都返回720)

使用helper函数的这个技巧允许函数将自身作为第一个参数接收,从而调用自身

要修改您的示例,请执行以下操作:

(function (f,x) { return f(f,x); })(
  function(me, i) { console.log(i); if (i<5) me(me,i+1); },
  0)
(函数(f,x){返回f(f,x);})(

函数(me,i){console.log(i);如果(i给匿名函数起一个名字,这里我给它起一个名字“389;”,虽然它被命名了,但它仍然是匿名的

(function _( i ) {
  console.log(i);
  if (i < 5){ _(i + 1); }
})(0);
(函数(i){
控制台日志(i);
如果(i<5){(i+1)}
})(0);

请注意,
参数.被调用方
已被弃用(如果您在JavaScript会议上听说过的话,也会大吵大闹),将来将不受支持。它也相当慢。另外,在使用函数表达式定义函数时命名函数(与声明语句相反)是有风险的,因为我没想到会在这个线程上学习一个新单词。“vociferly”非常棒。最好不要让它成为匿名函数,而是用函数声明语句定义的函数。
(function (f) { return f.apply(this, arguments); })(
  function(me, n) { return n<=1 ? n : n*me(me,n-1); },
  6);
(function (f,x) { return f(f,x); })(
  function(me, n) { return n<=1 ? n : n*me(me,n-1); },
  6);
(function (f,x) { return f(f,x); })(
  function(me, i) { console.log(i); if (i<5) me(me,i+1); },
  0)
(function _( i ) {
  console.log(i);
  if (i < 5){ _(i + 1); }
})(0);