2009-02-24 20 views
10

एक जावास्क्रिप्ट रनटाइम त्रुटि में यह स्निपेट परिणाम: (foo परिभाषित नहीं है)अपरिभाषित चर का उपयोग में अगर-बयान

if (foo) { 
    // ... 
} 

मैं, पहले foo परिभाषित करने के लिए है, इसलिए जैसे:

var foo = foo || null // or undefined, 0, etc. 

... और केवल तभी मैं कर सकता हूं:

if (foo) { 
    // ... 
} 

वह क्यों है?


अद्यतन:

यह चीजों की मेरी तरफ एक brainfart की कुछ हद तक था: 'fcourse आप एक चर जो आवंटित नहीं किया गया है का उपयोग नहीं कर सकते हैं।

मजेदार सामान जो आप एक अपरिभाषित चर पर एक प्रकार() कर सकते हैं। मैं miccet के उत्तर को स्वीकार कर रहा हूं क्योंकि मुझे लगता है कि यह सबसे सुंदर समाधान है।

+0

[यह] (http://2ality.com/2013/04/check-undefined.html) 2ality लेख विभिन्न सिफारिश का उल्लेख है _undefined_ की जांच करने के तरीके, जिसमें इसे बूलियन संदर्भों में _falsy_ के रूप में व्याख्या करना शामिल है। – martieva

उत्तर

11

आपको इसे मूल्य के लिए जांचने में सक्षम होने के लिए इसे परिभाषित करना होगा। इस मामले में आप मौसम की जांच कर रहे हैं यह सच है। यह चर स्पष्ट रूप से कुछ भी सेट नहीं है, उदाहरण के लिए सी # में शून्य और वीबी में कुछ भी नहीं है।

यदि आप चाहिए

, डिबगिंग मुद्दों या जो कुछ भी है, अगर चर इस तरह अपरिभाषित है आप जांच कर सकता है:

if (typeof(variable) == "undefined") 
+0

अच्छा छोटा स्निपेट। बहुत खूबसूरत। इसे ध्यान में रखेगा। यह अजीब बात है कि आप एक अपरिभाषित चर पर टाइप टाइप() कर सकते हैं, लेकिन नहीं: अगर (अपरिभाषित वैरिएबल! == शून्य)। – roosteronacid

+1

हाँ, मैंने यह एक बहुत आसान पाया है। मुझे लगता है कि कारण यह है क्योंकि आप इसे _into_ के बजाय _at_ देखते हैं, अगर यह समझ में आता है। – miccet

+0

+1 यह वही है जो मैं सुझाव देने जा रहा था। – cletus

1

यही होगा क्योंकि अब आप के साथ यह तय कर रहे हैं:

var foo = foo || null 

आप इसे पहली जगह क्यों परिभाषित नहीं करते? यह मेरे लिए बहुत सरल लगता है (जब तक कि मुझे कुछ याद आ रहा है)।

इसे बनाने से पहले एक चर का उपयोग करना (या कुछ सेट करना) खराब प्रोग्रामिंग अभ्यास है, और इससे बचा जाना चाहिए। मेरी सलाह है यह सुनिश्चित करने के लिए कि यह किसी चीज़ पर सेट है लेकिन तर्क त्रुटि को ट्रैक करने और इसे ठीक करने के लिए उस चाल का उपयोग करें।

0

यह मेरे लिए अजीब सवाल प्रतीत होता है। आइए कहें कि मैं एक फ़ंक्शन कॉल करना चाहता था: -

चीज़();

यदि चीज़ कहीं भी परिभाषित नहीं की गई है तो निश्चित रूप से मैं इसे असफल होने की उम्मीद करूंगा।

आप अपने कोड में कहीं भी इसे परिभाषित किए बिना foo नामक चर का उपयोग करने की अपेक्षा क्यों करेंगे?

18

मुझे लगता है कि आप पूछ रहे हैं क्योंकि आप जानते हैं कि जावास्क्रिप्ट कुछ परिस्थितियों में अनिर्धारित चर (यानी कोई रनटाइम त्रुटियों) की अनुमति नहीं देता है और दूसरों में नहीं। हमेशा अपरिभाषित चर जाँच पर एक त्रुटि फेंकता जावास्क्रिप्ट , लेकिन कभी नहीं अपरिभाषित जाँच गुण, जब तक कि आप केवल अविवेक के एक स्तर का उपयोग पर एक त्रुटि फेंकता है:

तर्क इस प्रकार है।

उदाहरण:

// throws runtime error 
if(foo) { 
    // ... 
} 

// does not throw runtime error 
if(window.foo) { 
    // ... 
} 

// does not throw runtime error 
var obj = {}; 
if(obj.foo) { 
    // ... 
} 

// throws runtime error 
if(obj.foo.bar) { // going two levels deep, but foo is undefined 
    // ... 
} 

आशा है कि यह थोड़ा साफ करता है।

+1

इसे साफ़ करने के लिए धन्यवाद। – roosteronacid

0

मुझे यह एक अजीब सवाल है। यह जवाब देने के लिए मुझे लगता है कि यह सवाल इसका उल्टा पूछने के लिए सबसे अच्छा है ...

क्या

if (foo) { 
    // ... 
} 

जहां foo एक चर के रूप में परिभाषित नहीं किया गया है की अपेक्षित परिणाम हो सकता है?

मुझे लगता है कि एकमात्र संभावित उत्तर यह है कि यदि हमेशा झूठे मूल्यांकन का मूल्यांकन होता है और आप उस ब्लॉक को कभी निष्पादित नहीं करेंगे।

आपको एक और सीधा सवाल पूछने के लिए, आप कोड को काम करने की अपेक्षा क्यों करेंगे जो वेरिएबल्स को संदर्भित करता है जो मौजूद नहीं हैं और उनके पास मूल्य निर्धारित नहीं किए गए हैं? आपके द्वारा ऊपर परिभाषित संदर्भ में foo क्या है?

नीचे की रेखा यह है कि घोषणा के बिना बाद के कथन का कोई अर्थ नहीं है। foo एक ऐसा शब्द नहीं है जिसका मूल्यांकन स्वयं किया जा सके ताकि आपको दुभाषिया को foo के संदर्भ के लिए एक संदर्भ देना होगा ताकि वह इसका मूल्यांकन कर सके।

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

आप एक संकलक यह यह भी के बारे में आप बता दिया होता ...

0

यह एक अजीब सवाल coz मैं एक ही नाव पर हूँ नहीं है था: पी

मैं googling के बाद यहाँ तक पहुँचने " जावास्क्रिप्ट उपयोग परिवर्तनीय अपरिभाषित "। मुझे उलझन में मिला है मैंने कहीं देखा है कि लोग आसानी से लूप में अपरिभाषित चर का उपयोग कर सकते हैं।

शायद मैं यह अलग भाषा पर देखा


मैं इसे पाया है। दूसरे कोड रनटाइम त्रुटि के दौरान पहले कोड सफलतापूर्वक निष्पादित किए गए।

पहले कोड:

test(); 
function test() { x = 4; } 
console.log(x); //this produce 4 

दूसरा कोड:

test(); 
function test() { x[0] = 1; } 
console.log(x[0]); 
संबंधित मुद्दे