2011-09-21 9 views
40

में फ़ंक्शन को परिभाषित और कॉल करना क्या जावास्क्रिप्ट में कोई फ़ंक्शन परिभाषित करने का कोई तरीका है और तुरंत इसे कॉल करें, जिस तरह से इसे पुन: उपयोग करने की अनुमति मिलती है?एक चरण

मुझे पता है तुम एक बंद अनाम प्रक्रियाएं कर सकते हैं:

(function(i) { 
    var product = i * i; 
    console.log(product); 
    // Can't recurse here because there's no (ECMA standard) way for the 
    // function to refer to itself 
}(2)); // logs 4 

या आप एक समारोह नाम कर सकते हैं तो यह बाद में फोन:

function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
} 

powers(2); // Logs 4, 16, 256... 

लेकिन वहाँ परिभाषित करने और बुलाने की एक क्लीनर तरीका है एक समारोह में एक जाना है? दोनों उदाहरणों के एक संकर की तरह क्रमबद्ध करें?

ऐसा करने में सक्षम नहीं होने से मुझे कुछ भी करने से रोका नहीं जा रहा है, लेकिन ऐसा लगता है कि यह $(document).ready() पर चलने वाले रिकर्सिव फ़ंक्शंस या फ़ंक्शंस लिखने का एक अच्छा अभिव्यक्तिपूर्ण तरीका होगा, लेकिन बाद में जब हालात बदल जाएंगे, आदि

+0

संभावित डुप्लिकेट [मैं एक JavaScript फ़ंक्शन का नाम और इसे तुरंत अमल कर सकते हैं?] (Http://stackoverflow.com/questions/6404196/can-i-name-a-javascript-function-and-execute -तुरंत-तुरंत) – brichins

उत्तर

43

आप कोशिश कर सकते हैं:

(window.powers = function(i) { 
 
    /*Code here*/ 
 
    alert('test : ' + i); 
 
})(2);
<a href="#" onclick="powers(654)">Click</a>

कार्य लिंक: http://jsfiddle.net/SqBp8/

+०१२३५१६४१०६

इसे लोड पर बुलाया जाता है, और पैरामीटर और alert बदलने के लिए मैंने इसे anchor tag में जोड़ा है।

+3

चालाक समाधान! 'खिड़की' के बिना भी काम करता है, लेकिन स्पष्ट रूप से अंतर्निहित ग्लोबल्स बुराई हैं ... – quis

+1

तत्काल निष्पादन समारोह से पहले बस 'var शक्तियां' जोड़ें और आप जाने के लिए अच्छे हैं। –

23

सब आप चाहते हैं अपने स्वयं के शरीर के भीतर समारोह का उपयोग है, तो आप बस function कीवर्ड के बाद एक नाम निर्दिष्ट कर सकते हैं:

> (function fac (n) { 
    return (n === 0 ? 1 : n*fac(n-1)); 
    })(10) 
3628800 

यह एक मानक सुविधा है (ECMA-262, एड 5.1, पी देखते हैं।। 98)।

+3

यह जो करता है उसके लिए यह बहुत ही सुरुचिपूर्ण है। – quis

8

यहां सभी उत्तरों आप जो चाहते हैं उसके करीब हैं, लेकिन कुछ समस्याएं हैं (इसे वैश्विक दायरे में जोड़ना, वास्तव में इसे कॉल नहीं करना आदि)। यह इस पृष्ठ पर कुछ उदाहरण को जोड़ती है (हालांकि यह दुर्भाग्य arguments.callee याद करने की आवश्यकता है):

var test = (function() { 
    alert('hi'); 
    return arguments.callee; 
})(); 

बाद में, आप यह कॉल कर सकते हैं:

test(); 
+2

एकमात्र समस्या यह है कि arguments.callee [बहिष्कृत] है (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments/callee) और सख्त में ES5 पर एक त्रुटि फेंकता है मोड। – Tivie

+2

@Tivie लेकिन आप अनाम कार्य का नाम दे सकते हैं। 'var test = (function fn() {चेतावनी ('hi'); वापसी fn;})();' –

4

आप वापसी मान के बारे में परवाह नहीं करते हैं , तुम यह केर सकते हो।

var powers = function powers(i) { 
    var product = i * i; 
    console.log(i * i); 
    if (product < 1e6) { powers(product) }; 
    return powers; 
}(2); 
की
संबंधित मुद्दे