परिचय: JavaScript शुरुआती लोगों के लिए एक खदान क्यों है?
\nJavaScript (विशेषकर Node.js वातावरण में) एक ऐसी भाषा है जिसमें बहुत सारे छिपे हुए खतरे हैं। इसकी गतिशील प्रकृति और एसिंक्रोनसिटी अक्सर उन लोगों को भी भ्रमित कर देती है जिन्होंने Python या Java में महारत हासिल कर ली है। ऐसा लगता है कि कोड काम कर रहा है, लेकिन सबसे अनुपयुक्त क्षण में undefined is not a function या NaN दिखाई देता है।
इस लेख में, हम शुरुआती JavaScript डेवलपर्स की शीर्ष गलतियों का विश्लेषण करेंगे - सामान्य टाइपो से लेकर गहरी अवधारणात्मक जाल तक। प्रत्येक बिंदु Node.js पर एक वास्तविक उदाहरण और इसे कैसे ठीक किया जाए, इसके स्पष्टीकरण के साथ होगा। चलिए शुरू करते हैं!
\n\n\n\n
1. var, let और const में भ्रम (स्कोप)
\nशुरुआती की सबसे आम गलती var का उपयोग let या const के बजाय करना है। Node.js में (विशेषकर सख्त मोड में) यह होइस्टिंग (hoisting) के कारण अप्रत्याशित व्यवहार की ओर ले जाता है।
समस्या
\nvar के माध्यम से घोषित चर में ब्लॉक स्कोप के बजाय फंक्शनल स्कोप होता है।
// गलती का उदाहरण\nfunction testLoop() {\n for (var i = 0; i < 5; i++) {\n setTimeout(() => console.log(i), 100);\n }\n}\ntestLoop(); // आउटपुट: 5, 5, 5, 5, 5 (0,1,2,3,4 नहीं)\n\nसमाधान
\nपरिवर्तनीय चर के लिए हमेशा let और अपरिवर्तनीय चर के लिए const का उपयोग करें। var का बिल्कुल उपयोग न करना बेहतर है।
// सही किया गया कोड\nfunction testLoopFixed() {\n for (let i = 0; i < 5; i++) {\n setTimeout(() => console.log(i), 100);\n }\n}\ntestLoopFixed(); // आउटपुट: 0, 1, 2, 3, 4\n\n\n\n
2. एसिंक्रोनसिटी को अनदेखा करना (Callback Hell और Promise)
\nNode.js एसिंक्रोनसिटी पर बना है। कोड को ऐसे लिखने का प्रयास करना जैसे कि यह क्रमिक रूप से निष्पादित होता है (जैसे Python में), Callback Hell और डेटा रेस की ओर ले जाता है।
\n\nसमस्या
\nनेस्टेड कॉलबैक और डेटा लोड होने से पहले उसे प्राप्त करने का प्रयास।
\n\n// खराब: Callback Hell\nconst fs = require('fs');\n\nfs.readFile('file1.txt', 'utf8', (err, data1) => {\n fs.readFile('file2.txt', 'utf8', (err, data2) => {\n // ... और इसी तरह\n console.log(data1 + data2);\n });\n});\n\nसमाधान
\nasync/await और Promise.all() का उपयोग करें। यह कोड को रैखिक और पठनीय बनाता है।
// अच्छा: async/await\nconst fs = require('fs').promises;\n\nasync function readFiles() {\n try {\n const [data1, data2] = await Promise.all([\n fs.readFile('file1.txt', 'utf8'),\n fs.readFile('file2.txt', 'utf8')\n ]);\n console.log(data1 + data2);\n } catch (err) {\n console.error('फ़ाइल पढ़ने में त्रुटि:', err);\n }\n}\nreadFiles();\n\n\n\n
3. this के संदर्भ को न समझना
\nJavaScript में, this यह निर्धारित नहीं होता कि फंक्शन कहाँ लिखा गया है, बल्कि यह कैसे कॉल किया गया है। Node.js में (ऑब्जेक्ट विधियों के बाहर), this एक खाली ऑब्जेक्ट {} को संदर्भित करता है, न कि global को (जैसा कि ब्राउज़र में होता है)।
समस्या
\nकॉलबैक के रूप में विधि पास करने पर संदर्भ का नुकसान।
\n\nconst user = {\n name: 'अलेक्से',\n greet() {\n console.log(`नमस्ते, ${this.name}!`);\n }\n};\n\nsetTimeout(user.greet, 1000); // आउटपुट: "नमस्ते, undefined!"\n\nसमाधान
\nएरो फंक्शन (जो अपना स्वयं का this नहीं बनाता) या .bind() विधि का उपयोग करें।
// विकल्प 1: bind\nsetTimeout(user.greet.bind(user), 1000);\n\n// विकल्प 2: एरो फंक्शन\nsetTimeout(() => user.greet(), 1000); // "नमस्ते, अलेक्से!"\n\n\n\n
4. === के बजाय == से तुलना करना
\n== ऑपरेटर प्रकारों को परिवर्तित करता है, जो अक्सर अप्रत्याशित परिणाम देता है। N