उस प्रश्न का वास्तविक उत्तर लगभग 3 पृष्ठ लंबा होगा। लेकिन मैं इसे जितना संभव हो उतना छोटा बनाने की कोशिश करता हूं। ईसीएमए-/जावास्क्रिप्ट सभी Execution Contexts
और Object
है। ECMAscript में तीन मूल प्रकार के संदर्भ हैं: Global context
, Function contexts
और eval contexts
।
हर बार जब आप कोई फ़ंक्शन कॉल करते हैं, तो आपका इंजन इसे अपने function context
में फैलाएगा। इसके अलावा, ऐसे Activation object
बनाए गए हैं। इस रहस्यवादी वस्तु एक function context
से बाहर होते हैं जो का हिस्सा है कम से कम:
- [[स्कोप श्रृंखला]]
- सक्रियण वस्तु
- "इस" संदर्भ मूल्य
वहाँ अधिक हो सकता है विभिन्न इंजनों पर गुण, लेकिन इन तीनों को ईएस के किसी भी कार्यान्वयन के लिए आवश्यक है। हालांकि, विषय पर वापस। यदि कोई फ़ंक्शन संदर्भ लागू किया जाता है, तो सभी parent contexts
(या अधिक सटीक रूप से, Activation objects
अभिभावक संदर्भों से) [[Scope]]
संपत्ति में कॉपी किए गए हैं। आप इस संपत्ति के बारे में एक सरणी की तरह सोच सकते हैं, जिसमें ऑब्जेक्ट्स (सक्रियण-) ऑब्जेक्ट्स हैं। अब, किसी भी फ़ंक्शन से संबंधित जानकारी सक्रियण ऑब्जेक्ट (औपचारिक पैरामीटर, चर, फ़ंक्शन घोषणाओं) में संग्रहीत होती है।
आपके उदाहरण में, digits
चर namenew
के लिए सक्रियण ऑब्जेक्ट में संग्रहीत है। दूसरा जब आंतरिक अज्ञात फ़ंक्शन बनाया जाता है, तो यह Activation object
को [[Scope]]
propertys में जोड़ता है।जब आप digits[n]
पर कॉल करते हैं, तो जावास्क्रिप्ट पहले उस चर को अपने में सक्रियण ऑब्जेक्ट में खोजने का प्रयास करता है। यदि यह विफल रहता है, तो खोज स्कोपेचैन में जाती है। और voila, वहां हम चर पाया क्योंकि हम बाहरी समारोह से एओ की प्रतिलिपि बनाई।
मैंने पहले से ही एक संक्षिप्त उत्तर के लिए बहुत कुछ लिखा है, लेकिन वास्तव में इस तरह के एक प्रश्न का अच्छा जवाब देने के लिए आपको यहां ईएस के बारे में कुछ बुनियादी ज्ञान समझाएं। मुझे लगता है कि आपको यह समझने के लिए पर्याप्त है कि वास्तव में "हुड के नीचे" क्या होता है (यदि आप और अधिक पढ़ना चाहते हैं तो मैं कुछ संदर्भ दूंगा)।
आप इसे करने के लिए कहा, तो आप इसे पाने:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
यह एक वस्तु है कि अंक सूची शामिल है, के साथ साथ एक विधि बनाने है। –