javascript - Var कीवर्ड का उद्देश्य क्या है और मुझे इसका उपयोग कब करना चाहिए(या इसे छोड़ दें)?




keyword ecmascript-5 (12)

नोट : यह प्रश्न ईसीएमएस्क्रिप्ट संस्करण 3 या 5 के दृष्टिकोण से पूछा गया था। ईसीएमएस्क्रिप्ट 6 के रिलीज में नई सुविधाओं के परिचय के साथ उत्तर पुराना हो सकता है।

जावास्क्रिप्ट में var कीवर्ड का फ़ंक्शन वास्तव में क्या है, और इसके बीच क्या अंतर है

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

तथा

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

आप कब एक का उपयोग करेंगे, और क्यों / यह क्या करता है?

https://code.i-harness.com


var प्रयोग न करें!

var एक चर घोषित करने के लिए pre-ES6 तरीका था। अब हम भविष्य में हैं , और आपको इस तरह कोडिंग करना चाहिए।

const प्रयोग करें और let

95% मामलों के लिए const का इस्तेमाल किया जाना चाहिए। यह ऐसा करता है कि परिवर्तनीय संदर्भ नहीं बदला जा सकता है, इस प्रकार सरणी, वस्तु, और डोम नोड गुण बदल सकते हैं और संभवतः const होना चाहिए।

किसी भी चर के लिए पुन: असाइन किए जाने की उम्मीद के लिए इस्तेमाल किया जाना चाहिए। इसमें लूप के भीतर शामिल है। यदि आपने कभी भी varName = प्रारंभिकरण से परे लिखा है, let उपयोग करें।

दोनों में ब्लॉक स्तर स्कोपिंग है, जैसा कि अधिकांश अन्य भाषाओं में अपेक्षित है।


"Var" चर का उपयोग किए बिना केवल एक मान निर्धारित करते समय परिभाषित कर सकते हैं। उदाहरण में:

my_var;

वैश्विक दायरे या किसी अन्य दायरे में काम नहीं कर सकते हैं। यह मूल्य के साथ होना चाहिए:

my_var = "value";

दूसरी ओर आप एक व्यवहार्य परिभाषित कर सकते हैं;

var my_var;

इसका मान undefined (इसका मान null नहीं है और यह दिलचस्प रूप से null बराबर नहीं है।)।


एक और अंतर उदाहरण के लिए

var a = a || [] ; // works 

जबकि

a = a || [] ; // a is undefined error.

एक कोड के अंदर यदि आप var का उपयोग किए बिना एक चर का उपयोग करते हैं, तो क्या होता है स्वचालित रूप से var var_name वैश्विक दायरे में रखा जाता है उदाहरण:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}

जब ब्राउज़र में जावास्क्रिप्ट निष्पादित किया जाता है, तो आपका सभी कोड एक कथन से घिरा हुआ है, जैसे:

with (window) {
    //Your code
}

एमडीएन के with अधिक जानकारी

चूंकि var वर्तमान दायरे में एक चर घोषित करता है, इसलिए खिड़की के अंदर var घोषित करने और इसे बिल्कुल घोषित करने के बीच कोई अंतर नहीं है।

अंतर तब आता है जब आप सीधे खिड़की के अंदर नहीं होते हैं, उदाहरण के लिए किसी फ़ंक्शन के अंदर या ब्लॉक के अंदर।

var का उपयोग करके आप बाहरी चर को छुपा सकते हैं जिनके समान नाम हैं। इस तरह आप एक "निजी" चर अनुकरण कर सकते हैं, लेकिन यह एक और विषय है।

अंगूठे का नियम हमेशा var उपयोग करना है, अन्यथा आप सूक्ष्म बग शुरू करने का जोखिम चलाते हैं।

संपादित करें: मुझे प्राप्त आलोचनाओं के बाद, मैं निम्नलिखित पर जोर देना चाहता हूं:

  • var वर्तमान दायरे में एक चर घोषित करता है
  • वैश्विक दायरा window
  • ग्लोबल स्कोप (खिड़की) में var का उपयोग नहीं करते हैं
  • var का उपयोग कर वैश्विक दायरे (विंडो) में एक चर घोषित करना इसे छोड़ने जैसा ही है।
  • var का उपयोग कर खिड़की से भिन्न स्कॉप्स में एक चर घोषित करना वही नहीं है जैसा कि var बिना एक चर घोषित करता है
  • हमेशा स्पष्ट रूप से var घोषित करें क्योंकि यह अच्छी प्रथा है

जैसा कि कोई इसे सीखने की कोशिश कर रहा है, वैसे ही मैं इसे देखता हूं। उपरोक्त उदाहरण शायद शुरुआती के लिए थोड़ा अधिक जटिल थे।

यदि आप यह कोड चलाते हैं:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

आउटपुट के रूप में पढ़ा जाएगा: झूठा, झूठा, सच, सच

क्योंकि यह फ़ंक्शन में वेरिएबल्स को इसके बाहर से अलग के रूप में देखता है, इसलिए स्थानीय चर शब्द और ऐसा इसलिए था क्योंकि हमने असाइनमेंट में var का उपयोग किया था। यदि आप फ़ंक्शन में var को हटाते हैं तो अब यह इस तरह पढ़ता है:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

आउटपुट झूठा, झूठा, झूठा, झूठा है

ऐसा इसलिए है क्योंकि स्थानीय दायरे या फ़ंक्शन में एक नया चर बनाने के बजाय यह केवल वैश्विक चर का उपयोग करता है और उन्हें गलत पर पुन: असाइन करता है।


मैं लोगों को उलझन में या बिना अंदर और अंदर या बाहर चर के घोषित करते समय उलझन में हूं। यहां एक गहरा उदाहरण है जो आपको इन चरणों के माध्यम से चलाएगा:

Jsfiddle पर कार्रवाई में नीचे दी गई स्क्रिप्ट देखें

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

निष्कर्ष

  1. कोई फर्क नहीं पड़ता कि var के साथ या बिना var (जैसे, बी) यदि उन्हें फ़ंक्शन के बाहर अपना मूल्य मिलता है, तो वे उनके मान को सुरक्षित रखेंगे और स्क्रिप्ट के माध्यम से विभिन्न कार्यों के अंदर जोड़े गए किसी भी अन्य मान को संरक्षित किया जाएगा।
  2. यदि परिवर्तनीय को किसी फ़ंक्शन (जैसे सी) के अंदर var के बिना घोषित किया गया है, तो यह पिछले नियम की तरह कार्य करेगा, यह अब से सभी कार्यों में अपना मूल्य सुरक्षित रखेगा। या तो इसे फ़ंक्शन testVar1 () में अपना पहला मान मिला है, यह अभी भी मान को संरक्षित करता है और फ़ंक्शन testVar2 () में अतिरिक्त मान प्राप्त करता है
  3. यदि चर केवल एक फ़ंक्शन के अंदर var के साथ घोषित किया गया है (जैसे testVar1 या testVar2 में डी) यह कार्य समाप्त होने पर अपरिभाषित होगा। तो यह एक समारोह में अस्थायी चर होगा।

यदि आप वैश्विक दायरे में हैं तो कोई फर्क नहीं पड़ता।

यदि आप एक फ़ंक्शन में हैं तो var एक स्थानीय चर बना देगा, "नो var" स्कोप चेन को तब तक देखेगा जब तक कि यह वैरिएबल पाता है या वैश्विक दायरे को हिट नहीं करता है (जिस बिंदु पर यह इसे बनाएगा):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

यदि आप असाइनमेंट नहीं कर रहे हैं तो आपको var का उपयोग करने की आवश्यकता है:

var x; // Declare x

यह कहकर कि " स्थानीय और वैश्विक " के बीच का अंतर पूरी तरह सटीक नहीं है।

" स्थानीय और निकटतम " के बीच का अंतर के रूप में इसके बारे में सोचना बेहतर हो सकता है। निकटतम निश्चित रूप से वैश्विक हो सकता है, लेकिन यह हमेशा मामला नहीं होगा।

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

वेरिएबल घोषित करने के लिए आपको हमेशा var कीवर्ड का उपयोग करना चाहिए। क्यूं कर? अच्छा कोडिंग अभ्यास स्वयं में एक कारण होना चाहिए, लेकिन var कीवर्ड के बिना एक चर घोषित करना इसका मतलब है कि इसे वैश्विक दायरे में घोषित किया गया है (इस तरह के एक चर को "अंतर्निहित" वैश्विक कहा जाता है)। डगलस क्रॉकफोर्ड ने कभी भी अंतर्निहित ग्लोबल्स का उपयोग करने की सिफारिश नहीं की है , और ऐप्पल जावास्क्रिप्ट कोडिंग दिशानिर्देशों के अनुसार:

var कीवर्ड के बिना बनाए गए किसी भी चर को वैश्विक दायरे में बनाया गया है और जब फ़ंक्शन लौटाता है (क्योंकि यह स्कोप से बाहर नहीं जाता है) कचरा नहीं होता है, जो स्मृति रिसाव के अवसर पेश करता है।

तो, संक्षेप में, हमेशा var कीवर्ड का उपयोग करके चर घोषित करें।


var बिना - वैश्विक चर।

हमेशा अलग-अलग कथन का उपयोग करने की अनुशंसा की जाती है, क्योंकि स्थानीय संदर्भ में वैश्विक परिवर्तनीय init - बुरा है। लेकिन, अगर आपको इस गंदे चाल की ज़रूरत है, तो आपको पृष्ठ की शुरुआत में टिप्पणी लिखनी चाहिए:

/* global: varname1, varname2... */

var साथ स्थानीय चर घोषित करने से आप कैसे बाहर निकल सकते हैं इसका एक अच्छा उदाहरण यहां दिया गया है:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( i लूप के प्रत्येक पुनरावृत्ति पर रीसेट किया गया है, क्योंकि यह स्थानीय रूप से लूप के for घोषित नहीं किया गया for लेकिन वैश्विक स्तर पर) अंततः अनंत लूप





ecmascript-5