[英]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);
或專門針對一個參數的函數,以避免apply
和arguments
:
(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.