2011-08-06 3 views
32

में जावास्क्रिप्ट चरणीय दायरा क्या "if" कथन में केवल "if" ब्लॉक के भीतर या पूरे फ़ंक्शन के भीतर दिखाई देने वाले चर को घोषित और असाइन किया गया है?आईएफ कथन

क्या मैं निम्नलिखित कोड में यह अधिकार कर रहा हूं? (काम करने लगता है, लेकिन "var संरचना" घोषित करना कई बार अजीब लगता है) कोई क्लीनर समाधान? इसलिए चर एक अंदर घोषित अगर बयान (या किसी भी सशर्त ब्लॉक) बाहरी गुंजाइश के लिए "फहराया" कर रहे हैं -

function actionPane(state) { 
    if(state === "ed") { 
     var structure = { 
      "element" : "div", 
      "attr" : { 
       "class" : "actionPane" 
      }, 
      "contains" : [{ 
       "element" : "a", 
       "attr" : { 
        "title" : "edit", 
        "href" : "#", 
        "class" : "edit" 
       }, 
       "contains" : "" 
      }, { 
       "element" : "a", 
       "attr" : { 
        "title" : "delete", 
        "href" : "#", 
        "class" : "delete" 
       }, 
       "contains" : "" 
      }] 
     } 
    } else { 
     var structure = { 
      "element" : "div", 
      "attr" : { 
       "class" : "actionPane" 
      }, 
      "contains" : [{ 
       "element" : "a", 
       "attr" : { 
        "title" : "save", 
        "href" : "#", 
        "class" : "save" 
       }, 
       "contains" : "" 
      }, { 
       "element" : "a", 
       "attr" : { 
        "title" : "cancel", 
        "href" : "#", 
        "class" : "cancel" 
       }, 
       "contains" : "" 
      }] 
     } 
    } 
    return structure; 
} 
+0

ध्यान दें कि आप यह भी कर सकते हैं: 'if (state ===" ed ") {वापसी {...}} अन्य {वैरिएबल का उपयोग करने के बजाय {वापसी {...}}। –

उत्तर

35

1) Variables are visible for the whole function scope। इसलिए, आपको केवल उन्हें एक बार घोषित करना चाहिए।

2) आपको अपने उदाहरण में दो बार चर घोषित नहीं करना चाहिए। मैं समारोह के शीर्ष पर चर घोषित करने, तो बस मूल्य बाद में स्थापित करने की सलाह देते हैं:

function actionPane(state) { 
    var structure; 
    if(state === "ed") { 
     structure = {  
      ... 

जावास्क्रिप्ट पर उत्कृष्ट प्रतिक्रिया के लिए, मैं अत्यधिक डगलस Crockford द्वारा JSLint का उपयोग करें। यह सामान्य त्रुटियों के लिए आपके कोड को स्कैन करेगा, और सफाई के लिए सुझाव मिलेगा।

मैं छोटी पुस्तक जावास्क्रिप्ट को पढ़ने की भी सिफारिश करता हूं: गुड पार्ट्स। इसमें रखरखाव जेएस कोड लिखने के लिए बहुत सारी युक्तियां हैं।

+0

@WebWanderer - जो केवल ईएस 6 पर लागू होता है, जो कि कमाल है, लेकिन क्लाइंट-साइड का उपयोग करने के लिए एक कंपाइलर की आवश्यकता होती है। ES5 और पुराने वैश्विक या फ़ंक्शन-स्तरीय दायरे के अलावा किसी अन्य चीज़ का समर्थन नहीं करते हैं। – OverZealous

+0

मुझे लगता है कि हर कोई जेएसलिंट के बजाय जेएसआईंट का उपयोग करता है। –

+0

@ केविनविलेर यह एक पुराना जवाब है, लेकिन ईएस 6 या नए पर काम करने वाला कोई भी व्यक्ति [ईएसलिंट] (http://eslint.org/) पर माइग्रेट करने से बेहतर होगा। – OverZealous

31

जावास्क्रिप्ट यह केवल समारोह गुंजाइश है, कोई "ब्लॉक गुंजाइश है।"

if(true) { 
    var foo = "bar"; 
} 
alert(foo); // "bar" 

यह वास्तव में एक स्पष्ट चित्र पेंट (और अनुभव :)

var foo = "test"; 
if(true) { 
    alert(foo); // Interviewer: "What does this alert?" Answer: "test" 
    var foo = "bar"; 
} 
alert(foo); // "bar" Interviewer: Why is that? Answer: Because JavaScript does not have block scope 

समारोह गुंजाइश, जावास्क्रिप्ट में से, साक्षात्कार में आता है, आम तौर पर बंद होने का उल्लेख है।

var bar = "heheheh"; 
var blah = (function() { 
    var foo = "hello"; 
    alert(bar); // "heheheh" 
    alert(foo); // "hello" (obviously) 
}); 

blah(); // "heheheh", "hello" 
alert(foo); // undefined, no alert 

फ़ंक्शन के आंतरिक दायरे में उस वातावरण तक पहुंच है जिसमें यह निहित है, लेकिन दूसरी तरफ नहीं।

अपने दूसरे प्रश्न का उत्तर देने के लिए, प्रारंभिक रूप से 'न्यूनतम' ऑब्जेक्ट का निर्माण करके ऑप्टिमाइज़ेशन हासिल किया जा सकता है जो सभी शर्तों को पूरा करता है और फिर उस विशेष स्थिति (ओं) के आधार पर इसे संशोधित या संशोधित करता है जो संतुष्ट/संतुष्ट होता है।

+6

जावास्क्रिप्ट में ब्लॉक स्कोप है। आप 'if myVar =' का उपयोग करके 'if statement' के भीतर चर को घोषित कर सकते हैं, इसे पहले देखें! "' ['Let' कीवर्ड] देखें (https://developer.mozilla.org/en-US/docs/Web/जावास्क्रिप्ट/संदर्भ/वक्तव्य/चलो) – WebWanderer

+0

@WebWanderer यहां दिसंबर 2015 में शायद ही कभी समर्थित है, यह उत्तर अगस्त 2011 में पोस्ट किया गया था। – trex005

+0

@ trex005 हाँ, मुझे वह मिलता है। तकनीकी रूप से, यह अभी तक समर्थित नहीं है, लेकिन ईसीएमए 6 के साथ होगा। मेरी टिप्पणी ओपी के लिए नहीं है, जिसने चार साल से अधिक का जवाब नहीं पाया है, लेकिन इसके बजाय दूसरों को इस पोस्ट से गुज़रने के लिए यह सोचने की बात है कि यह कैसे करें अभी व। मेरी टिप्पणी को इच्छापूर्ण सोच के रूप में लें। – WebWanderer

2

अगर कथन के अंदर घोषित वेरिएबल्स तब तक उपलब्ध होंगे जब तक वे एक ही कार्य में रहते हैं।

var structure = { 
    "element" : "div", 
    "attr" : { 
     "class" : "actionPane" 
    }, 
    "contains" : [{ 
     "element" : "a", 
     "attr" : { 
      "title" : "edit", 
      "href" : "#", 
      "class" : "edit" 
     }, 
     "contains" : "" 
    }, { 
     "element" : "a", 
     "attr" : { 
      "title" : "delete", 
      "href" : "#", 
      "class" : "delete" 
     }, 
     "contains" : "" 
    }] 
} 

if(state != "ed") { 
    // modify appropriate attrs of structure (e.g. set title and class to cancel) 
} 
2

चर घोषित कर दिया और एक "अगर" बयान में सौंपा हैं:

आपके मामले में, सबसे अच्छा तरीका है संरचना की घोषणा और फिर वस्तु के कुछ हिस्सों कि या तो मामले में मतभेद है संशोधित करने के लिए किया जाएगा उस "अगर" ब्लॉक के भीतर या पूरे समारोह में केवल दिखाई दे रहा है?

जावास्क्रिप्ट में, सभी चर या तो

  • वैश्विक क्षेत्र हैं
  • स्थानीय गुंजाइश (पूरे समारोह) - जावास्क्रिप्ट एक "ब्लॉक गुंजाइश" जहां चर एक साथ ही उपलब्ध हैं नहीं है स्थानीय गुंजाइश (समारोह) के छोटे ब्लॉक

मैं निम्नलिखित कोड में यह सही कर रहा हूँ? (काम करने लगता है, लेकिन "var संरचना" घोषित करना कई बार अजीब लगता है) कोई क्लीनर समाधान?

हां। एक क्लीनर समाधान structure की बेस क्लास बनाने के लिए हो सकता है, और प्रत्येक मामले में अलग-अलग संशोधित हो सकता है।

+0

जावास्क्रिप्ट में कक्षाएं नहीं हैं। –

+1

@ टोमालक: जावास्क्रिप्ट * करता है *, हालांकि, ऑब्जेक्ट्स हैं, जो कक्षाओं के बराबर हैं। – foxy

+0

जावास्क्रिप्ट में ऑब्जेक्ट्स हैं। लेकिन इसका ओओपी मॉडल प्रोटोटाइप-आधारित, _not_ क्लास-आधारित है। –

3

ECMAScript 2015 (ES6) दो नए कीवर्ड, बोलचाल की वाक्य रचना है कि अंत जावास्क्रिप्ट काम के आसपास का उपयोग करने की आवश्यकता के बिना उचित ब्लॉक scoping पूरा करने के लिए अनुमति देने के शामिल हैं:

  1. let
  2. const

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

  • कोई संबंधित समस्या नहीं^_^