2013-05-24 9 views
7

मैंने हमेशा सोचा है कि ब्राउज़र स्ट्रिंग द्वारा ऊपर से नीचे स्ट्रिंग से जावास्क्रिप्ट कोड निष्पादित करते हैं (आप इस व्यवहार को एक स्क्रिप्टिंग भाषा से अपेक्षा करते हैं)। लेकिन स्पष्ट रूप से यह मामला यहाँ नहीं है:जावास्क्रिप्ट का वास्तव में व्याख्या कैसे किया जाता है?

// काम करता है सही

<script> 
    test(); 
    function test() { alert('test'); } 
</script> 

लेकिन अगर मैं एक चर के रूप में समारोह की घोषणा के साथ यह विफल रहता है 'Uncaught ReferenceError: परीक्षण से परिभाषित नहीं है':

<script> 
    test(); 
    var test = function() { alert('test'); } 
</script> 

तो जावास्क्रिप्ट इंजन कभी-कभी कोड को ऊपर से नीचे तक निष्पादित नहीं करता है। यह किसी भी तरह से कार्यों को प्रीलोड कर सकता है भले ही उन्हें अंत में घोषित किया गया हो। यह वास्तव में कैसे काम करता है और क्यों?

+0

मेरा मानना ​​है कि फ़ंक्शन() {} केवल एक विशेष मामला है, जो दायरे के शीर्ष पर ले जाया जाता है। मुझसे गलती भी हो सकती है। –

+4

इसे * ए [एएसटी] (http://en.wikipedia.org/wiki/Abstract_syntax_tree) जैसे किसी चीज़ में निष्पादित करने से पहले पूरी तरह से पार्स किया गया है। यही कारण है कि आप स्रोत के नीचे लाइनों के लिए "सिंटेक्स त्रुटियां" देख सकते हैं। – Matt

+0

यहां शीर्ष उत्तर पर एक नज़र डालें: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper

उत्तर

9

यह फ़ंक्शन और वेरिएबल होस्टिंग का एक उदाहरण है: फ़ंक्शन और परिवर्तनीय घोषणाएं मौजूदा दायरे के शीर्ष पर स्थानांतरित हो जाती हैं।

आपका उदाहरण आंतरिक रूप से यह करने के लिए बदल रहे हैं:

केस 1:

<script> 
    function test() { alert('test'); } 
    test(); 
</script> 

केस 2:

<script> 
    var test; 
    test(); 
    test = function() { alert('test'); } 
</script> 

इस से आप अनुमान लगा सकते हैं, कि दूसरे मामले चर test में अपरिभाषित है, जब आप इसे निष्पादित करने का प्रयास करते हैं।

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