2012-07-21 14 views
45

JSLint एक मान्य कोड के रूप में इस गुजर नहीं है:वैश्विक चर मौजूद है या नहीं, यह जांचने का सही तरीका क्या है?

/* global someVar: false */ 
if (typeof someVar === "undefined") { 
    var someVar = "hi!"; 
} 

सही तरीका क्या है?

+0

ध्यान दें कि '' var' if' ब्लॉक के दायरे वाला नहीं है असाइन किया गया है इस चेक विफल हो जाएगा। ऐसा लगता है कि आपने 'if' के ऊपर 'var someVar' लिखा था। रेफरी: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting – leewz

उत्तर

62
/*global window */ 

if (window.someVar === undefined) { 
    window.someVar = 123456; 
} 

if (!window.hasOwnProperty('someVar')) { 
    window.someVar = 123456; 
} 
+5

'/ * वैश्विक विंडो * /' के बजाय, आप '/ * jslint ब्राउज़र का उपयोग कर सकते हैं: true * /'। – XP1

+11

एक ही परिणाम होने के लिए, दूसरा समाधान वास्तव में 'if (! Window.hasOwnProperty (' someVar ') होना चाहिए) ' – Pioul

+2

क्या होगा यदि कोई पृष्ठ आपके सामने इस स्क्रिप्ट को चलाता है:' अपरिभाषित = 'कुछ मान''? –

13
/** 
* @param {string} nameOfVariable 
*/ 
function globalExists(nameOfVariable) { 
    return nameOfVariable in window 
} 

इससे कोई फर्क नहीं पड़ता कि आप वर foo या window.foo के साथ एक वैश्विक चर बनाया - वैश्विक संदर्भ में वर के साथ बनाया चर विंडो में लिखा जाता है।

+3

बेशक, आपको फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है, आप बस '' foo का उपयोग कर सकते हैं "विंडो में कहीं भी – gvlasov

+3

हरमएम, जेएसलिंट कहते हैं: 'अप्रत्याशित' में '। अपरिभाषित के साथ तुलना करें, या इसके बजाय hasOwnProperty विधि का उपयोग करें। 'फिर, मुझे लगता है, सही तरीका है: 'window.hasOwnProperty (" nameOfVar ")' – gvlasov

+1

@Susei: jsLint गलत है। '.hasOwnProperty()' दोषपूर्ण है क्योंकि एक वैश्विक हो सकता है जो 'विंडो' की प्रोटोटाइप श्रृंखला को आगे बढ़ाता है। यह अभी भी एक वैश्विक चर है, लेकिन '.hasOwnProperty() 'इसे नहीं देख पाएगा। 'इन' या 'अपरिभाषित' परीक्षण इसे करने का तरीका हैं। –

4
if (typeof someVar === "undefined") { 
    var someVar = "hi!"; 
} 

जांच करेगा कि someVar (स्थानीय या वैश्विक) अनिर्धारित रहता है।

आप एक वैश्विक चर के लिए जाँच करना चाहते हैं आप

if(window['someVar'] === undefined) { 
    ... 
} 

संभालने उपयोग कर सकते हैं यह एक ब्राउज़र :)

7

कोशिश

variableName in window 

या

typeof window[variableName] != 'undefined' 
में है

या

window[variableName] !== undefined 

या

window.hasOwnProperty(variableName) 
+2

क्या आपने JSLint पर इन परीक्षण करने का प्रयास किया था? विंडो में "कुछ वार", "टाइपफ विंडो ['कुछ वार']! == 'अपरिभाषित'", "विंडो ['कुछवार']! == अपरिभाषित" (इसे बिना विंडो में परिवर्तित किए "window.someVar! == अपरिभाषित) जेएसलिंट पर ठीक नहीं हैं। लेकिन वैसे भी, आपके महान उत्तर के लिए धन्यवाद :) –

+1

'ऑब्जेक्ट में' प्रोप "बिल्कुल कानूनी जावास्क्रिप्ट है। याद रखें, जेएसलिंट आपके लिए है, न कि जेएसलिंट के लिए, और जेएसलिंट जावास्क्रिप्ट नहीं है। मेरे लिए 'अगर (ओबीजे में 'प्रोप') {do_it();}' अधिक स्पष्ट है (यानी पठनीय और रखरखाव योग्य), फिर 'if (obj.prop! == अपरिभाषित) {do_it();} '। मैं आपको सुझाव दूंगा इस मामले में जेएसलिंट को अनदेखा करने के लिए। http://stackoverflow.com/questions/6824895/jslint-error-unexpected-in-compare-with-undefined-or-use-the-hasownproperty भी देखें। – kstep

+0

आप बिल्कुल सही हैं लेकिन मैं मेरे कोड जेएसलिंट को वैध रखने के लिए, क्योंकि इसे बनाए रखना आसान है। –

8

मुझे लगता है कि यह वास्तव में JSLint के साथ एक समस्या है। यह निम्न त्रुटि जारी करेगा:

Unexpected 'typeof'. Compare directly with 'undefined'.

मुझे विश्वास है कि यह बुरी सलाह है। जावास्क्रिप्ट में, undefined एक वैश्विक चर है जो आमतौर पर, अनिर्धारित है। लेकिन कुछ ब्राउज़र स्क्रिप्ट को इसे संशोधित करने की अनुमति देते हैं, जैसे: window.undefined = 'defined'। यदि ऐसा है, तो undefined के साथ सीधे तुलना करने से अप्रत्याशित परिणाम हो सकते हैं। सौभाग्य से, मौजूदा ईसीएमए 5 अनुरूप ब्राउज़र undefined पर असाइनमेंट की अनुमति नहीं देते हैं (और सख्त मोड में अपवाद फेंक देंगे)।

मैं typeof someVar === "undefined" पसंद करता हूं, जैसा कि आपने पोस्ट किया है, या someVar in window सूसेई के सुझाव के अनुसार।

+1

आज विशेष रूप से प्रासंगिक है क्योंकि सभी जेएस ब्राउज़र में नहीं चलेंगे। अगर आप एक लाइब्रेरी लिख रहे हैं तो आप चाहते हैं कि आपका कोड दोनों काम करे ब्राउज़रों के साथ-साथ रनटेम्स जैसे नोडज जहां खिड़की मौजूद नहीं है। –

12

आप एक वैश्विक चर केवल यदि वह पहले से मौजूद नहीं है आवंटित करने के लिए इच्छुक रहे हैं, तो कोशिश:

window.someVar = window.someVar || 'hi'; 

या

window['someVar'] = window['someVar'] || 'hi'; 
+0

यह सबसे सुरुचिपूर्ण और साफ-सुथरा समाधान है। – Christian

2

bfavaretto सही नहीं है।

किसी मूल्य पर वैश्विक अपरिभाषित सेट अप करने से अपरिभाषित के खिलाफ वस्तुओं का परीक्षण नहीं बदलेगा। JavaScript कंसोल अपने पसंदीदा ब्राउज़रों के लिए इस प्रयास करें:

var udef; var idef = 42; 
alert(udef === undefined); // Alerts "true". 
alert(idef === undefined); // Alerts "false". 
window.undefined = 'defined'; 
alert(udef === undefined); // Alerts "true". 
alert(idef === undefined); // Alerts "false". 

यह केवल जावास्क्रिप्ट सभी अनदेखी और किसी भी मान अपरिभाषित चर पर सेट किया जा करने का प्रयास किया की वजह से है।

window.undefined = 'defined'; 
alert(window.undefined); // Alerts "undefined". 
+4

आपको किसी अन्य व्यक्ति के उत्तर को अस्वीकार करने के लिए केवल उत्तर अनुभाग का उपयोग नहीं करना चाहिए। यदि आप नहीं सोचते कि किसी अन्य व्यक्ति का उत्तर काम करता है, तो आप उनके उत्तर पर टिप्पणी करते हैं कि आप जिस समस्या को देखते हैं, उसे ठीक कर सकते हैं ताकि वे इसे ठीक कर सकें या प्रश्न के लिए अपना स्वयं का वैध समाधान प्रदान कर सकें। – Scott

+1

यह प्रासंगिक है, लेकिन यह सवाल का जवाब नहीं देता है।मुझे एहसास है कि एक टिप्पणी के रूप में पोस्ट करना बहुत लंबा है, शायद आप अपनी असहमति के नीचे प्रश्न भी _answer_ कर सकते हैं? –

+1

आप मेरे जवाब पर एक टिप्पणी छोड़ सकते थे बस मुझे यह बताने के लिए कि आप असहमत हैं, मैंने केवल आपके जवाब को दुर्घटना से देखा है। आप हमारे "पसंदीदा ब्राउज़र" के बारे में सही हैं, समस्या यह है कि पुराने ब्राउज़र ने इसे रोक नहीं दिया था। मैं इसे और अधिक स्पष्ट करने के लिए अपना उत्तर संपादित करूंगा। – bfavaretto

1

यह जांच करने का एक आसान तरीका होगा।

लेकिन अगर variableName घोषित किया जाता है और साथ boolean value: false

if(window.variableName){ 

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

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