2013-03-01 3 views
5

हाय मैं जावास्क्रिप्ट के लिए नया हूं, और मैं ओरेली के जावास्क्रिप्ट को निश्चित मार्गदर्शिका पढ़ रहा हूं। घोषणा बयान खंड में यह कहते हैं:क्या कार्य घोषणा सशर्त बयान के भीतर प्रकट नहीं होनी चाहिए?

var a = 1; 
while(a < 5){ 
    a++; 
    function double(a){return a * 2 }; 
    console.log(double(a)); 
}  

यह Node.js लगता है मुझे किसी भी त्रुटि नहीं देता है और उम्मीद के रूप में चलाने:

enter image description here

मैं एक साधारण परीक्षण किए गए। इस पर कोई टिप्पणी?

+2

इसे सख्त मोड में चलाएं, और आपको अपनी त्रुटि मिल जाएगी। यह अमान्य वाक्यविन्यास है * (मोज़िला के जेएस कार्यान्वयन को छोड़कर जहां एक समान वाक्यविन्यास की अनुमति है) *, लेकिन कार्यान्वयन द्वारा ऐतिहासिक रूप से अनुमति दी गई है। –

उत्तर

-1

यह सच नहीं है। हालांकि आपको यह ध्यान में रखना चाहिए कि वे व्यवहार नहीं कर सकते क्योंकि आप उम्मीद कर सकते हैं।

उदाहरण के लिए, इस काम करेगा:

if(false) { 
    function double(a) {return a*2;}; 
} 
else { 
    console.log(double(4)); 
} 

भले ही आप सोच सकते हैं समारोह में परिभाषित किया गया कभी नहीं किया गया है एक if जाता है कि कभी नहीं पहुँच के अंदर न होने के कारण समारोह वास्तव में की चोटी पर फहराया जाता है वर्तमान "ब्लॉक" (चाहे वह एक युक्त फ़ंक्शन हो या संपूर्ण <script> टैग या फ़ाइल हो) और इसलिए कहीं भी पहुंच योग्य है।

आप एक if ब्लॉक के अंदर function परिभाषाएँ नहीं रखना चाहिए, लेकिन कोई कारण नहीं क्यों आप नहीं कर सकते नहीं है।

+1

आपके पास बहुत सारे कारण नहीं हैं - 1. कल्पना नहीं कहती है, 2. कुछ ब्राउज़रों पर, यह काम नहीं करता है! – Alnitak

+0

@Alnitak मैंने विशेष रूप से कहा था कि आपको नहीं करना चाहिए। हालांकि hoisting पर विनिर्देशों के अनुसार यह बिल्कुल 'var' के समान है। –

+0

यह spec के अनुसार मान्य नहीं है, तो विनिर्देशन "hoisting" * (spec में उपयोग नहीं किया जाने वाला शब्द) के बारे में क्या वर्णन करता है * लागू नहीं होता है। कार्यान्वयन इसे अनुमति दे सकता है, और इसके उत्थान का इलाज कर सकता है, लेकिन यह अभी भी मान्य नहीं है। –

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