2017-12-15 105 views
5

मैंने 15 से अधिक वर्षों तक कोल्डफ्यूजन प्रोग्राम किया है, लेकिन इस पर कभी नहीं आया।ठंडे फ़्यूज़न तर्कों का अजीब व्यवहार बाहरी कार्य को जीवित करता है?

<cfset _run()> 
<cffunction name="_run"> 
    <cfset variables.dataArray=ArrayNew(1)> 
    <cfset local.data={ 
    area="profile" 
    }> 
    <cfset _append(data=local.data,field="name")> 
    <cfset _append(data=local.data,field="phone")> 
    <cfdump var="#variables.dataArray#" label="dataArray"> 
</cffunction> 
<cffunction name="_append"> 
    <cfargument name="data" type="struct" required="yes"> 
    <cfargument name="field" type="string" required="yes"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfset arguments.data.field=arguments.field> 
    <cfset ArrayAppend(variables.dataArray,arguments.data)> 
</cffunction> 

आप इस देख सकते हैं है कि मुझे क्या करना: यहाँ व्यवहार को दोहराने के लिए एक कोड है

  1. चर दायरे में एक सरणी Initing एक struct Initing यह विश्व स्तर पर सुलभ
  2. बनाने के लिए स्थानीय गुंजाइश
  3. _append समारोह
  4. करने के लिए डेटा लागू वीं में दूसरे क्षेत्र आइटम (फोन) जोड़कर पहले क्षेत्र आइटम (नाम) जोड़ में (local.data) ई में एक ही तरीके

इस कोड को निम्नलिखित उत्पादन में परिणाम होगा:

Dump of output

आप देख सकते हैं, डुप्लिकेट प्रविष्टियों, साथ एक सरणी में कोड परिणाम जब आप उम्मीद कर सकते हैं कि पहले सूचकांक फ़ील्ड = "नाम" होना चाहिए। जैसा कि आप भी देख सकते हैं, दूसरी बार _app करने के लिए लागू डेटा का मूल्य, "फ़ील्ड" मान के साथ "फ़ील्ड" गुण होता है। ऐसा लगता है कि पहली बार हम समारोह कहलाते हुए तर्क के दायरे में रहते हैं? यह कैसे संभव है। मैंने सोचा कि तर्क का दायरा कैफंक्शन टैग के अंदर अलग किया गया था?

लेकिन अगर मैं इस के साथ _append समारोह की जगह:,

Dump of output 2

आप देख सकते हैं arguments.data का डुप्लिकेट बनाने:

<cffunction name="_append"> 
    <cfargument name="data" type="struct" required="yes"> 
    <cfargument name="field" type="string" required="yes"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfset local.data=Duplicate(arguments.data)> 
    <cfset local.data.field=arguments.field> 
    <cfset ArrayAppend(variables.dataArray,local.data)> 
</cffunction> 

यह निम्न उत्पादन दे देंगे इसे "फ़ील्ड" जोड़ने से पहले, समस्या हल करती है। ध्यान दें कि बस कर रहे हैं:

<cfset local.data=arguments.data> 

पर्याप्त नहीं था।

क्या कोई तर्क के दायरे के इस व्यवहार को समझा सकता है?

उत्तर

4

तो कुछ शोध के बाद, मैं इस पर एडोब ColdFusion दस्तावेज़ीकरण पृष्ठ (मेरे द्वारा किया पाठ के Bolding) में पाया गया:

के बारे में तर्क गुंजाइश

सभी प्रकार्य तर्क अपने स्वयं के दायरे में मौजूद हैं, तर्क का दायरा फ़ंक्शन कॉल के जीवन के लिए तर्क स्कोप मौजूद है। जब फ़ंक्शन वापस आता है, तो दायरा और उसके चर नष्ट हो जाते हैं। हालांकि, तर्क स्कोप को नष्ट करना संरचनाओं या क्वेरी ऑब्जेक्ट्स को चर को नष्ट नहीं करता है, जो कोल्डफ्यूजन संदर्भ द्वारा फ़ंक्शन में गुजरता है। कॉलिंग पेज पर वेरिएबल्स जिन्हें आप फ़ंक्शन तर्क के रूप में उपयोग करते हैं, मौजूद हैं; यदि फ़ंक्शन तर्क मान बदलता है, तो कॉलिंग पृष्ठ में चर बदलते मान को दर्शाता है।

यह मेरे लिए एक आंख खोलने वाली थी, और यह :)

+0

हाँ, सबसे जटिल वस्तुओं पारित कर रहे हैं भविष्य में मुसीबत से बाहर मुझे रखेंगे संदर्भ द्वारा। Arrays एक अजीब अपवाद हैं। ज्यादातर बार वे "मूल्य से" पारित होते हैं। तो _append की तरह एक udf उस फ़ंक्शन के बाहर सरणी की स्थिति को संशोधित नहीं कर सका। – Ageax

+0

आप जावा के ऐरेलिस्ट ('createObject (" जावा, "java.util.ArrayList") का उपयोग कर सकते हैं। Init() ') यदि आपको संदर्भ द्वारा सरणी की आवश्यकता है। – Alex

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