2012-03-17 13 views
7

यह आम और समारोह बनाने के लिए आसान है की तरह है। मैं केवल एक परिस्थिति के साथ आ सकता हूं जिसमें कोई वेबपृष्ठ पर कुछ जेएस कोड टाइप कर रहा है और इसे चला रहा है। इसे eval के साथ भी हल किया जा सकता है।समारोह वस्तु आवश्यक

फ़ंक्शन ऑब्जेक्ट क्यों?

उत्तर

13

Function ऑब्जेक्ट का उपयोग गतिशील रूप से कार्यों को उत्पन्न करने के लिए किया जा सकता है।

var some_fixed_value = 1; 
var f = new Function("return " + some_fixed_value); 

विरोध करने के लिए:

var some_fixed_value = 1; 
var f = function() { 
    return some_fixed_value; 
}; 
// Break the function logic: 
some_fixed_value = 'not_fixed_any_more!'; 

या दो समारोह अभिव्यक्ति का उपयोग करते:

var f = (function(copy_of_fixed_value) { 
    return function() { 
     return copy_of_fixed_value; 
    }; 
})(some_fixed_value); 

"यह भी eval साथ हल किया जा सकता":

var func_func = new Function('x', 'return x'); //function anonymous(x){return x} 
var evil_func = eval('function(x){return x}'); //SyntaxError: function statement 
               // requires a name 
var eval_func = eval('(function(x){return x})');//function(x){return x} 
+0

'फ़ंक्शन फैक्ट्री (रेट) {रिटर्न फ़ंक्शन() {वापसी ret;};}; ' – onemach

+0

@onemach इसमें एक और फ़ंक्शन अभिव्यक्ति शामिल है। आपके प्रश्न का क्या मतलब है? –

+0

आप बंद होने के साथ भी ऐसा ही कर सकते हैं। – Gumbo

3

समारोह (पूंजी के साथ एफ) कोई कीवर्ड नहीं है, यह जावास्क्रिप्ट में किसी भी अन्य कार्यों के लिए बेस क्लास है, इस तथ्य को देखते हुए कि जावास्क्रिप्ट में सब कुछ एक ऑब्जेक्ट है, कार्यों को बेस क्लास से प्राप्त करना चाहिए/जो अन्य सभी कार्यों की मूल कार्यक्षमता का प्रतिनिधित्व करता है (विधियां/वर्ग)।

आप समारोह के प्रोटोटाइप के माध्यम से समारोह विरासत के साथ एक बहुत खेल सकते हैं:

यहाँ जे एस में सभी कार्यों के लिए एक .run विधि को परिभाषित करने के एक उदाहरण है:

Function.prototype.run = function (delay) { 
    setTimeout(this, delay); 
}; 

परीक्षण:

function test(){console.log("test")}; 
test.run(2000); 

एक अनियंत्रित __proto__ संपत्ति है जो बेस-क्लास प्रोटोटाइप को इंगित करती है, आप इसे फ़ंक्शन के प्रत्येक उदाहरण पर देख सकते हैं:

test.__proto__ == Function.prototype; // true 
+0

बिल्कुल! अधिकांश बिल्टिन कन्स्ट्रक्टर (जैसे 'स्ट्रिंग',' ऐरे ',' फंक्शन ') को कॉल करने का इरादा नहीं है, बल्कि विस्तारित किया जाना है। – georg

संबंधित मुद्दे