2012-05-15 8 views
10

Adobe ColdFusion 10: Using closures documentation से उद्धरित:CF10 में क्लोजर के चर का दायरा कैसे बढ़ाया जाए?

function helloTranslator(String helloWord) 
{ 
    return function(String name) 
    { 
     return "#helloWord#, #name#"; 
    }; 
} 

कैसे गुंजाइश helloWord और वापसी लाइन पर ठीक से name के लिए? क्या वे Arguments स्कोप में हैं? यदि ऐसा है, तो वे अद्वितीय होना चाहिए?

Closures and functions अनुभाग भी कहा गया है पहले से ही लंबी गुंजाइश खोज के शीर्ष पर 4 अधिक दायरे देखते हैं:

  1. बंद का:

    बंद में, निम्न एक unscoped चर के लिए खोज का आदेश है local गुंजाइश

  2. बंद के arguments गुंजाइश
  3. बाहरी समारोह के local गुंजाइश अगर availa ble
  4. मालिक समारोह के local गुंजाइश यदि उपलब्ध
  5. ColdFusion में निर्मित गुंजाइश

अगर मैं 'local.' के रूप में गुंजाइश कुछ है, यह केवल खोज करेंगे 1, या 1,3 & 4?

बीटीडब्ल्यू, मैं क्लोजर & बाहरी समझता हूं। मालिक कौन है?

धन्यवाद


अद्यतन: संवर्धन अनुरोध दायर: ColdFusion 10.0 - Feature 3191742

उत्तर

7
function helloTranslator(String helloWord) 
    { 
     return function(String name) 
     { 
     return "#helloWord#, #name#"; 
     }; 
    } 

यहाँ helloWord और name scoped नहीं किया जा सकता। "फंक्शन के भीतर परिभाषित बंद" के साथ एक अंतर्निहित Owner स्कोप है जो घोषित करने (स्थानीय) फ़ंक्शन का स्थानीय दायरा है, जहां ये चर मौजूद हैं। इसलिए इन चरों को बंद होने से एक्सेस करने के लिए अद्वितीय (फ़ंक्शन के भीतर) होना चाहिए।

बंद में, एक unscoped चर के लिए खोज के माध्यम से चला जाता है:

  1. बंद के स्थानीय गुंजाइश
  2. बंद के तर्कों गुंजाइश
  3. बाहरी/स्वामी समारोह के स्थानीय गुंजाइश यदि उपलब्ध
  4. बाहरी/स्वामी समारोह के तर्क गुंजाइश यदि उपलब्ध
  5. वैरिएबल स्कोप (बंद करने के समय उपलब्ध उपलब्ध)
  6. कोल्डफू सायन बिल्ट-इन स्कोप

अगर कुछ बंद होने पर Local के रूप में स्कॉप्ड किया गया है, तो यह केवल 1 में खोजेगा। एएफएन के पास 3,4 के लिए सीधे गुंजाइश करने का कोई तरीका नहीं है।

पेज। जैसा कि पहले कहा गया था Owner गुंजाइश एक अंतर्निहित दायरा नहीं है जो बंद करने के निर्माण के समय माता-पिता/बाहरी कार्य के स्थानीय दायरे की कैश की गई प्रति को इंगित करता है।

पेज। इस दायरे को स्पष्ट करने के लिए आप log an enhancement with ColdFusion कर सकते हैं।

विभिन्न क्षेत्रों का एक उदाहरण निम्नानुसार है। इसे चलाएं और आप समझ जाएंगे कि क्लोजर अलग-अलग क्षेत्रों का उपयोग कैसे करेगा।

any function exampleClosureForm(arg1){ 

    function x(innerArg1,innerArg2){ 
     //var arg1= 50;// will hide parent's arg1 if declared 
     writedump(arguments);// would dump closure's 
     writedump(local);// would dump closure's 
     writedump(session.a); // would be same session shared across 
     writedump(arg1); // would dump parents argument arg1 
     return session.a-- + innerArg1+innerArg2+arg1--;// decrementing to see its behavior for successive call 
    }; 
    writeoutput(x(1,2)); 
    writedump(arguments,"browser","html",false,"function");// would dump parent's 
    writedump(local,"browser","html",false,"function");// would dump parent's 
    arg1 = -100; // since closure is sharing the parent's variable, this change should get reflected 
    return x; 
} 
session.a = 10; 
a = exampleClosureForm(10); 
writeoutput("now the calls <br>"); 
writeoutput(a(innerArg1=5,innerArg2=5)); 
writeoutput("<br>"); 
// with argumentcollection 
argsColl = structNew(); 
argsColl.innerArg1= 1; 
argsColl.innerArg2= 3; 
writeoutput(a(argumentCollection = argsColl)); 
+0

आप एक और अधिक पूरा कोड उदाहरण प्रदान करें सकते हैं, तो लेबल जो वर जो गुंजाइश के हैं? और बंद करने के निर्माण के समय क्या var उपलब्ध है? शायद इस विषय पर एक ब्लॉग पोस्ट? यह भ्रमित हो रहा है। धन्यवाद। – Henry

+0

ईआर दायर: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@ हेनरी उदाहरण टिप्पणी में फिट नहीं होगा इसलिए मैं इसके लिए एक अलग जवाब डाल रहा हूं –

2

हाँ, जहाँ तक मैं बता सकता हूँ, एक माता पिता समारोह के तर्कों के लिए एक गुंजाइश है, तो अपने बंद करने के तर्कों निर्दिष्ट नहीं कर सकते अलग-अलग नाम होने की आवश्यकता है। एक चाहिए में एक माता पिता के तर्कों दायरे का उल्लेख करने में सक्षम हो:

function helloTranslator(String s){ 
    var otherS = arguments.s; 
    return function(String s){ 
     return "#otherS#, #s#"; 
    }; 
} 

यह आदर्श से कम है: क्या आप करने की आवश्यकता होगी एक अलग नाम के साथ, माता पिता के समारोह में एक मध्यस्थ चर है एक स्कोप्ड फैशन, केवल एक मैच के लिए शिकार करने के लिए सीएफ की आवश्यकता नहीं है।

यदि मैं आप थे तो raise a bug with Adobe होगा।

+0

ईआर दायर: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

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