2016-11-05 5 views
5

Google क्रोम और फ़ायरबग मुझे इस उदाहरण के साथ दो अलग-अलग आउटपुट देते हैं।जावास्क्रिप्ट: विभिन्न कीवर्ड का उपयोग नहीं करते समय दो आउटपुट

यदि ख वैश्विक हो जाता है, तो पहले मुझे अपरिभाषित और दूसरा एक 14 का अधिकार देना चाहिए? लेकिन फायरबग में, यह दो 14s देता है और क्रोम संदर्भ त्रुटि देता है।

function a() { 
     b = 14; 
} 
console.log(b); 
a(); 
console.log(b); 
+0

'बी' आपके कोड में वैश्विक नहीं है। – melancia

+2

@MelanciaUK: यह ढीला मोड में है। सख्त मोड में, यह एक 'संदर्भ त्रुटि' है। –

+1

बस इसे फायरबग में चलाया और मुझे एक संदर्भ त्रुटि दी। शुरुआत में 'var b;' जोड़ने के बाद मैं एक अनिर्धारित और 14 प्राप्त करने में कामयाब रहा। –

उत्तर

6

गुंजाइश प्रयोगों के लिए ब्राउज़र कंसोल का उपयोग न करें। विभिन्न ब्राउज़र कंसोल आपके कोड को विभिन्न तरीकों से चलाते हैं।

आपको लगता है कि कोड एक सामान्य वातावरण में उद्धृत बिल्कुल के रूप में चलाते हैं, सही बात यह है कि आप पहली बार console.log(b) लाइन से एक ReferenceError मिलेगा:

function a() { 
     b = 14; 
} 
console.log(b); // ReferenceError 
a(); 
console.log(b); 
भी ढीला मोड में

, पढ़ने का प्रयास एक अविकसित पहचानकर्ता का मूल्य ReferenceError है।

अगर हम कि प्रारंभिक console.log निकालने के लिए, हम एक क्षेत्र ढीला बनाम सख्त मोड पर निर्भर करता है कि में होगी:

// In loose mode 
function a() { 
     b = 14; 
} 
a(); 
console.log(b); // 14 

कि है अंतर्निहित वैश्विक की हॉरर; ढीले मोड में, एक अविकसित पहचानकर्ता को असाइन करना एक वैश्विक चर बनाता है।

बनाम।

// In strict mode 
"use strict"; 
function a() { 
     b = 14; // ReferenceError 
} 
a(); 
console.log(b); 

... यह कैसे होना चाहिए।


मेरी कमजोर थोड़ा ब्लॉग पर एक पोस्ट है कि।

+0

क्या यह इस तरह काम नहीं करता है? संकलन समय पर, ** var b ** ऊपर जाता है (वैश्वीकरण)। जब यह कार्यक्रम चलाने के लिए समय आ गया है, बी, पहली उत्पादन के लिए करने के लिए ** अपरिभाषित ** मूल्यांकन करती है और दूसरी बार 14 – Meysam

+1

@Meysam: वहाँ अपने कोड में कोई 'वर b' है, इसलिए नहीं, कि नहीं कैसे कि कोड है काम करता है। ** यदि ** आपके पास वैश्विक दायरे में 'var b' था, तो यह अलग-अलग काम करेगा, हां। –

+1

@ मेयसम कोई "संकलन समय" नहीं है। और आपके पास 'var b' नहीं है। और यह वैश्वीकरण के रूप में 'बी'" ऊपर नहीं जाता है "- वैरिएबल _hoisted_ होगा लेकिन घोषणा के ऊपर नहीं बल्कि घोषणा के शीर्ष पर होगा। – vlaz

3

पहले console.log() को संदर्भ त्रुटि देना चाहिए, क्योंकि चर उस समय परिभाषित नहीं किया गया है। अगर यह फायरबग में अलग-अलग व्यवहार करता है, तो यह फायरबग में एक बग है।

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