क्या कोई समझा सकता है कि किसी फ़ंक्शन (nextInLine) के अंदर किसी सरणी संदर्भ (arr) पर संचालन करने से वैश्विक सरणी में मान बदल जाते हैं जब मैंने कुछ भी नहीं किया है (जो मुझे पता है of) मेरे फ़ंक्शन के भीतर से वैश्विक सरणी globalArr पर काम करने के लिए?

मैंने सोचा था कि फ़ंक्शन में दिए गए मानों के साथ फ़ंक्शन में संचालन करना मूल रूप से स्थानीय चर पर संचालन की तरह था और मुझे फ़ंक्शन के भीतर से वैश्विक चर का संदर्भ देना होगा या यदि मैं उन मानों को फ़ंक्शन के बाहर पहुंच योग्य बनाना चाहता हूं तो मुझे एक मान वापस करना होगा।

https://codepen.io/jakeNesom/pen/eWMXdP?editors=1111

function nextInLine(arr, item) {


  arr.push(item);
  item = arr.shift();
  return item ;  
}

// Test Setup
var globalArr = [1,2,3,4,5];

// Display 
console.log("Before: " + JSON.stringify(globalArr));
console.log(nextInLine(globalArr, 10)); // Modify this line to test
console.log("After: " + JSON.stringify(globalArr)); 
0
Jake 12 मई 2017, 07:14

2 जवाब

सबसे बढ़िया उत्तर

जावास्क्रिप्ट मूल्य से गुजरता है, इसलिए जब आप अपने फ़ंक्शन को इस तरह से आमंत्रित करते हैं

nextInLine(globalArr, 10)

उस फ़ंक्शन में पास किया गया GlobalArr संदर्भ उसी स्थान की ओर इशारा करता है जहाँ आपने अपनी सरणी को इनिशियलाइज़ किया है।

इसलिए जब आपके नेक्स्टइनलाइन फ़ंक्शन के अंदर आप कॉल करते हैं

arr.push(item);

आपने किसी आइटम को अपने वैश्विक सरणी में धकेल दिया है।

मुझे लगता है कि आप जो गलत कर रहे थे वह एक फ़ंक्शन के दायरे में केवल एक फ़ंक्शन के दायरे में घोषित चर था जब तक कि आप उनके लिए कोई संदर्भ नहीं लौटाते।

function foo(){
  var a = 10;
  console.log(a); //10
}
console.log(a); //undefined
0
derp 12 मई 2017, 07:41

ऐसा इसलिए है क्योंकि आप फ़ंक्शन में ऑब्जेक्ट (globalArr) पास करते हैं। जब आप किसी वस्तु को पास करते हैं, तो आप उसका संदर्भ देते हैं। हालांकि, जावास्क्रिप्ट में डिफ़ॉल्ट तंत्र मूल्य से गुजरना है। यही कारण है कि जब आप इसे फ़ंक्शन को संशोधित करते हैं तो सरणी का आपका मूल मान भी बदल जाता है।

0
Nurjan 12 मई 2017, 07:36