簡體   English   中英

如何使這個JavaScript工作?

[英]How to make this javascript work?

我正在嘗試制作一個遞歸的匿名函數。

這是功能:

(function (i) {
    console.log(i);
    if (i < 5) this(i + 1)
})(0)

我知道“這個”是窗口對象。 有沒有辦法調用該功能?

可以使用arguments.callee屬性。

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

實現相同功能的另一種方法是命名功能。 在范圍之外,名稱將不可用:

(function tmp(i){console.log(i);if(i<5)tmp(i+1)})(0); //OK, runs well
alert(typeof tmp); // Undefined


請注意,在嚴格模式下禁止使用arguments.callee屬性:

 "use strict"; (function(){arguments.callee})(); 

拋出:

TypeError:嚴格模式函數或調用它們的參數對象可能無法訪問'caller','callee'和'arguments'屬性

你給匿名函數命名,這里我給它起一個名字“_”,雖然它被命名,但它仍然是匿名的。

(function _( i ) {
  console.log(i);
  if (i < 5){ _(i + 1); }
})(0);

啊...遞歸的函數形式.... [[[flash back to comp sci class]]]

你可以使用輔助函數:

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

(返回720;這是階乘函數,遞歸的規范示例)

這反過來可能是匿名的:

(function (f) { return f.apply(this, arguments); })(
  function(me, n) { return n<=1 ? n : n*me(me,n-1); },
  6);

或專門針對一個參數的函數,以避免applyarguments

(function (f,x) { return f(f,x); })(
  function(me, n) { return n<=1 ? n : n*me(me,n-1); },
  6);

(兩者都返回720)

使用輔助函數的這個技巧允許您的函數接收自己作為其第一個參數,從而調用自身。

要適應你的例子:

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

在Firebug中按預期工作(將0,1,2,3,4,5日志記錄到控制台)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM