2009-11-10 6 views
14

मैं आशा करती हूं किसी ने मुझे समझाने क्यों जावास्क्रिप्ट नीचे/HTML दिखाएगा "दरवाजा # 2" जब HTML एक ब्राउज़र में देखा जाता है कर सकते हैं:एक JavaScript मान संदर्भित होने से पहले ही घोषित किया जाता है - किसी को समझा सकता है इस

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <script type="text/javascript"> 
     function testprint() { 
      alert('door #1'); 
     }; 

     window.onload = testprint; 

     function testprint() { 
      alert('door #2'); 
     }; 

     testprint = function() { 
      alert('door #3'); 
     }; 
    </script> 
    <script type="text/javascript"> 
     function testprint() { 
      alert('door #4'); 
     }; 
    </script> 
</head> 
<body> 
</body> 
</html> 

के बाद से केवल window.onload से पहले घोषणा testprint होता testprint के लिए सेट है, मैं window.onload कारण '# 1 दरवाजा' दिखाने के लिए उम्मीद करेंगे। असल में, अधिभार 'दरवाजा # 2' का कारण बनता है। ध्यान दें कि यह ऐसा करेगा कि testprint की पहली घोषणा शामिल है या नहीं।

testprint के तीसरे और चौथे घोषणा समारोह बताए के विभिन्न साधनों का उपयोग करें, मैं इस कोशिश की है, तो यह एक ही में window.onload के व्यवहार को ओवरराइड देखने के लिए की testprint करता है दूसरा घोषणा थी। यह नहीं था। ध्यान दें कि यदि मैं पहली स्क्रिप्ट ब्लॉक के अंत में testprint की चौथी घोषणा को स्थानांतरित करता हूं तो इसे window.onload द्वारा बुलाया जाएगा।

उत्तर

38

समारोह घोषणाओं उत्थापन का विषय हैं, और वे पार्स समय में मूल्यांकन किया जाता है, उत्थापन तरह से है कि वे जहां वे घोषित किया गया में पूरे दायरे के लिए उपलब्ध हैं, उदाहरण के लिए:

foo(); // alerts foo 
foo = function() { alert('bar')}; 
function foo() { alert('foo');} 
foo(); // alerts bar 

करने के लिए पहली कॉल foo, समारोह घोषणा निष्पादित करेंगे क्योंकि पार्स समय पर यह उपलब्ध कराया गया था, foo की दूसरी कॉल समारोह अभिव्यक्ति निष्पादित करेंगे, रन-टाइम पर घोषित कर दिया।

फ़ंक्शन एक्सप्रेशन और फ़ंक्शन घोषणाओं के बीच अंतर के बारे में अधिक विस्तृत चर्चा के लिए, this question और this article देखें।

+0

होस्टिंग कार्य करने के लिए एक सूक्ष्मता है जहां [ब्राउज़र असहमत] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope#Conditional_defining_a_function)। _SpiderMonkey_ ** ** सशर्त दायरे में घोषित किए गए कार्यों को नहीं बढ़ाएगा जबकि _V8_ (लेखन के समय) ऐसा करता है। –

-1

फ़ंक्शन टेस्टप्रिंट पृष्ठ पर वैश्विक है। testprint = function ... एक चर निर्दिष्ट करता है, कि मुझे बिल्कुल पूरा दायरा नहीं है, लेकिन मुझे यह विचार मिलता है कि यह फ़ंक्शन टेबल शब्दकोश में पहली बार नहीं जोड़ा गया है।

0

कारण # 3 विंडो नहीं बदलता है। लोड यह है कि संदर्भों को संदर्भ द्वारा संदर्भित किया जाता है, नाम से नहीं। जब आप window.onload = testprint सेट करते हैं, तो यह testprint (सीएमएस द्वारा समझाया गया दरवाजा # 2) के वर्तमान मान को window.onload पर संदर्भित करता है। testprint के मूल्य को बदलकर window.onload के मान को प्रभावित नहीं करता है।

द्वार # 4 दरवाजा # 2 ओवरराइड नहीं करता है (जब तक आपने कहा था, आप इसे पहले स्क्रिप्ट ब्लॉक में ले जाते हैं) क्योंकि यह एक अलग स्क्रिप्ट ब्लॉक में है, इसलिए पहले ब्लॉक के बाद इसे पार्स किया जाता है।

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

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