2012-01-10 8 views
5

मैं एक रिकर्सिव अनाम फ़ंक्शन बनाने की कोशिश कर रहा हूं।यह जावास्क्रिप्ट काम कैसे करें?

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

मैं जानता हूँ कि "इस" खिड़की वस्तु है:

यहाँ कार्य है। क्या फ़ंक्शन को कॉल करने का कोई तरीका है?

+1

** ** सबसे अच्छी ** बात यह है कि यह एक अज्ञात फ़ंक्शन न हो, बल्कि इसके बजाय फ़ंक्शन घोषणा विवरण के साथ परिभाषित एक फ़ंक्शन है। – Pointy

उत्तर

12

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', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

+1

धन्यवाद! मैं बेहतर सो जाऊंगा। –

+4

ध्यान दें कि 'arguments.callee' को बहिष्कृत किया गया है (और काफी जोरदार रूप से, अगर आपने इसे किसी जावास्क्रिप्ट कॉन्फ़्रेंस में कभी भी सुना है), और भविष्य में समर्थित नहीं होगा। यह भी बहुत धीमी है। साथ ही, जब आपके फ़ंक्शन * अभिव्यक्ति * (घोषणा घोषणा के विपरीत) के साथ परिभाषित किया जाता है तो आपके कार्यों का नामकरण जोखिम भरा होता है क्योंकि [ब्राउज़र कभी-कभी अजीब चीजें करते हैं।] (Http://kangax.github.com/nfe/) – Pointy

+0

इस धागे पर एक नया शब्द सीखने की उम्मीद नहीं थी। "Vociferously" शानदार है। –

1

आह ... रिकर्सन के कार्यात्मक रूप .... [[[विज्ञान विज्ञान कक्षा के लिए फ्लैशबैक]]]

आप एक सहायक समारोह इस्तेमाल कर सकते हैं:

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 सांत्वना देने)

1

आप गुमनाम कार्य करने के लिए एक नाम देने के काम करता है, यहां मैं इसे एक नाम "_" देता हूं, हालांकि इसका नाम है, लेकिन यह अभी भी अज्ञात है।

(function _(i) { 
    console.log(i); 
    if (i < 5){ _(i + 1); } 
})(0); 
संबंधित मुद्दे