2013-04-02 7 views
5
x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

3 अलर्ट का परिणाम है: 1, undefined, 2 (क्रोम 25)स्थानीय घोषणा से पहले मेरा वैश्विक चर क्यों छायांकित है?

मेरा प्रश्न है: क्यों दूसरे अलर्ट अपरिभाषित है? क्यों नहीं 1? क्या कोई वैश्विक परिवर्तनीय एक्स नहीं है? कारण hoisting को

+0

क्योंकि आप अपने फ़ंक्शन में 'x' छाया करते हैं। तो एक फ़ंक्शन-स्कोप्ड वेरिएबल 'x' है, जिसे अभी तक एक मान असाइन नहीं किया गया है, इसलिए आप अपरिभाषित हो जाते हैं। यही कारण है कि फ़ंक्शन की शुरुआत में अपने चर घोषित करने की हमेशा अनुशंसा की जाती है, क्योंकि यह आपके लिए भी किया जाएगा। खुद को भ्रमित न करने का प्रयास करें। – Chad

उत्तर

12

, यह क्या निष्पादित हो जाता है:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was. 

    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

समारोह y() के शुरू में, स्थानीय चर x घोषित किया जाता है, लेकिन प्रारंभ नहीं किया गया।

+0

लेकिन यदि "x" "hoisting" है, तो क्या कोई संघर्ष नहीं है? क्योंकि पहले से ही "x = 1" है? कौन सी घोषणा पहली है? "hoisting x" या "x = 1"? –

+0

जावास्क्रिप्ट में "संघर्ष" नहीं है "छाया"। स्थानीय चर "छाया" एक ही नाम के साथ किसी भी चर एक उच्च दायरा है। तो बाद में जब आप 'x' का उपयोग करते हैं तो यह स्थानीय-सबसे दायरे का उपयोग कर रहा है। वैश्विक एक को पहले परिभाषित किया गया है, लेकिन 'y' के दायरे में स्थानीय का उपयोग किया जाता है। – Chad

+0

स्कॉइंग कार्य करने का तरीका यह है कि जावास्क्रिप्ट पहले चर एक्स के लिए स्थानीय दायरे में दिखता है। अगर इसे पाता है, तो यह देखना बंद कर देता है, इसलिए हम कभी भी वैश्विक एक्स तक नहीं पहुंचते। यदि यह नहीं मिलता है, तो यह फ़ंक्शन घोषित होने पर स्कोप के स्तर तक पहुंच जाता है, और उसी पैटर्न के साथ वहां खोज करता है। (इस मामले में, यह तब घोषणा पाता है, क्योंकि यह वैश्विक दायरे तक पहुंच गया है)। तो, मूल रूप से, यह एक प्याज की तरह काम करता है, बाहर अंदर। –

1

फ़ंक्शन में परिवर्तनीय घोषणा शीर्ष पर फिसल गई है। तो यह तकनीकी रूप से इस तरह दिखता है:

var y = function() { 
    var x; 

    alert(x); 

    x = 2; 
}; 

स्थानीय चर वैश्विक वैश्विक ओवरहेड करता है। यही कारण है कि अलर्ट undefined देता है।

0

चूंकि जावास्क्रिप्ट में दायरा एक कार्य वस्तु है। जब आप किसी फ़ंक्शन (कोड कोड) में कुछ कोड निष्पादित करते हैं, तो "चेतावनी (x)" फ़ंक्शन में "x" की कोई परिभाषा है या नहीं। तो, इस फ़ंक्शन में "var x = 2" है। लेकिन जावास्क्रिप्ट क्रम इस तरह अपने कोड की व्याख्या करेगा:

x = 1; 
alert(x); 
var y = function() { 
    var x; 
    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

तो, दूसरे अलर्ट में एक्स "अनिर्धारित" नहीं "1" है। तो जब आप किसी फ़ंक्शन में कुछ चर घोषित करते हैं, तो मैं आपको अपने फ़ंक्शन के शीर्ष में चर घोषित करने की सलाह देता हूं।

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