2012-06-12 19 views
5

क्यों दो स्क्रिप्ट अलग हैं? जो मैं चाहता हूं वह पहली स्क्रिप्ट है, लेकिन दूसरे ड्रॉडाटा() में यह डेटा बदलता है, यह अजीब है। क्या कोई मुझे बता सकता है कि यह क्यों है, और इसे कैसे ठीक किया जाए। धन्यवाद!जावास्क्रिप्ट फ़ंक्शन में सरणी बदलना फ़ंक्शन के बाहर सरणी बदलता है?

var data =   ["right"] ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs[0]="omg"; 
    } 
    alert(data[0]); 

} 
drawData(data); 
drawData(data,"percentage"); 

2: - तो इस परिवर्तन समारोह के बाहर देखा जाता है

var data =   "right" ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs="omg"; 
    } 
    alert(data); 

} 
drawData(data); 
drawData(data,"percentage"); 
+4

ऐसा इसलिए है क्योंकि एक वस्तु स्वयं ही है। जब कोई ऑब्जेक्ट संशोधित होता है * वह * ऑब्जेक्ट संशोधित होता है। जब किसी फ़ंक्शन पर कोई मान (ऑब्जेक्ट) पास किया जाता है तो यह ** कॉपी नहीं किया जाता है, क्लोन या डुप्लिकेट नहीं किया जाता है ** (आंतरिक रूप से विभिन्न तकनीकों का उपयोग किया जाता है, लेकिन यह अर्थात् सही है)। यही है, केवल एक सरणी है - और वह * वही * सरणी फ़ंक्शन के अंदर बदल दी गई है। यदि आप बाहर को प्रभावित करने के डर के बिना इसे बदलने में सक्षम होना चाहते हैं, तो पहले एक प्रति बनाएं। एक साधारण सरणी के लिए यह 'Array.prototype.slice' के साथ किया जा सकता है। अन्यथा, jQuery जैसी पुस्तकालयों में आसान कॉपी विधियां हैं। –

+0

ओह, और उत्तर, ** ** कहने से पहले ** "संदर्भ द्वारा पास करें", कृपया [मूल्यांकन रणनीतियां] (http://en.wikipedia.org/wiki/Evaluation_strategy) पढ़ें और "संदर्भ" शब्द को खोजें [ईसीएमएस्क्रिप्ट विनिर्देश] (http://es5.github.com/) और अपने शब्द विकल्पों का बैक अप लेने में सक्षम हो। धन्यवाद! –

+1

धन्यवाद, मुझे कुछ दिलचस्प मिला है [http://stackoverflow.com/](http://stackoverflow.com/questions/122102/what-is-the-most- कुशल-way-to-clone- ए-जावास्क्रिप्ट-ऑब्जेक्ट) बस जॉन रेजिग के जवाब को देखें। –

उत्तर

0

पहले संस्करण वस्तु कार्य करने के लिए पैरामीटर के रूप में पारित कर दिया (जो सरणी होने के लिए होता है) को संशोधित करता है। दूसरा संस्करण फ़ंक्शन पैरामीटर (जो सरणी के संदर्भ में होता है) के लिए नया मान निर्दिष्ट करता है लेकिन सरणी को स्वयं नहीं बदलता है।

+1

प्रतिक्रिया इस प्रश्न के लिए बहुत अस्पष्ट/गुप्त है और बीमार परिभाषित शर्तों का उपयोग करती है: "इस सरणी के संदर्भ में परिवर्तन"? यह ऑब्जेक्ट म्यूटेबिलिटी (ऑब्जेक्ट पर किसी प्रॉपर्टी का असाइनमेंट) के साथ स्कोप (स्थानीय चर का असाइनमेंट) भी जोड़ता है। –

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