एक जावास्क्रिप्ट समारोह में वैश्विक चर को परिभाषित करें


511

क्या जावास्क्रिप्ट फ़ंक्शन में वैश्विक चर को परिभाषित करना संभव है?

मैं अन्य कार्यों में trailimageचर ( makeObjफ़ंक्शन में घोषित ) का उपयोग करना चाहता हूं ।

<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title></title>
        <script type="text/javascript">
            var offsetfrommouse = [10, -20];
            var displayduration = 0;
            var obj_selected = 0;
            function makeObj(address) {
                **var trailimage = [address, 50, 50];**
                document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0"  style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
                obj_selected = 1;
            }

            function truebody() {
                return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
            }
            function hidetrail() {
                var x = document.getElementById("trailimageid").style;
                x.visibility = "hidden";
                document.onmousemove = "";
            }
            function followmouse(e) {
                var xcoord = offsetfrommouse[0];
                var ycoord = offsetfrommouse[1];
                var x = document.getElementById("trailimageid").style;
                if (typeof e != "undefined") {
                    xcoord += e.pageX;
                    ycoord += e.pageY;
                }
                else if (typeof window.event != "undefined") {
                    xcoord += truebody().scrollLeft + event.clientX;
                    ycoord += truebody().scrollTop + event.clientY;
                }
                var docwidth = 1395;
                var docheight = 676;
                if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
                    x.display = "none";
                    alert("inja");
                }
                else
                    x.display = "";
                x.left = xcoord + "px";
                x.top = ycoord + "px";
            }

            if (obj_selected = 1) {
                alert("obj_selected = true");
                document.onmousemove = followmouse;
                if (displayduration > 0)
                    setTimeout("hidetrail()", displayduration * 1000);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
            top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
        </form>
    </body>
</html>

19
वैश्विक घोषित करने के लिए बस "वर" कीवर्ड का उपयोग न करें
Ibu

20
@ इब्राहिम: "वैश्विक घोषित करने के लिए बस" var "कीवर्ड" Gak का उपयोग न करें ! डरावना ! ;-) शुक्र है, सख्त मोड निहित ग्लोबल्स के साथ दूर करता है।
टीजे क्राउडर

28
@ इब्राहिम डायलो - का उपयोग varनहीं एक वैश्विक चर घोषित नहीं करता है । एक अघोषित चर का मान निर्दिष्ट करने का एक परिणाम वैश्विक वस्तु पर एक संपत्ति का निर्माण है, जो एक चर घोषित करने के लिए काफी अलग है।
रॉब

1
इस उत्तर में उपयोगी जानकारी, stackoverflow.com/a/4862268/1356098 :)
Erenor Paz

जवाबों:


739

हां, जैसा कि अन्य लोगों ने कहा है, varवैश्विक पैराग्राफ घोषित करने के लिए आप वैश्विक दायरे (सभी कार्यों के बाहर) का उपयोग कर सकते हैं :

<script>
var yourGlobalVariable;
function foo() {
    // ...
}
</script>

वैकल्पिक रूप से, आप एक संपत्ति पर असाइन कर सकते हैं window:

<script>
function foo() {
    window.yourGlobalVariable = ...;
}
</script>

... क्योंकि ब्राउज़रों में, सभी वैश्विक चर वैश्विक चर घोषित किए varजाते हैं जो windowवस्तु के गुण हैं । (नवीनतम विनिर्देश में, ECMAScript 2015, वैश्विक गुंजाइश पर नए let, constऔर classवक्तव्य वैश्विक वस्तु के गुण नहीं बनाते हैं; ES2015 में एक नई अवधारणा।)

( अंतर्निहित ग्लोबल्स का आतंक भी है , लेकिन इसे उद्देश्य पर न करें और दुर्घटना से बचने के लिए अपना सर्वश्रेष्ठ प्रयास करें, शायद ईएस 5 का उपयोग करके "use strict"।)

सभी ने कहा: यदि आप संभवतः (और आप लगभग निश्चित रूप से कर सकते हैं) तो मैं वैश्विक चर से बचूंगा। जैसा कि मैंने उल्लेख किया है, वे अंत में के गुण हैंwindow , और windowपहले से ही काफी भीड़ है जो सभी तत्वों के साथ एक id(और कई के साथ name) केवल इसे डंप किया जा रहा है (और उस आगामी विनिर्देश की परवाह किए बिना, आईई nameवहां पर किसी भी चीज के बारे में बस इतना ही कहता है )।

इसके बजाय, अपने कोड को एक स्कूपिंग फ़ंक्शन में लपेटें और उस स्कोरिंग फ़ंक्शन के लिए स्थानीय चर का उपयोग करें, और अपने अन्य कार्यों को इसके भीतर बंद करें:

<script>
(function() { // Begin scoping function
    var yourGlobalVariable; // Global to your code, invisible outside the scoping function
    function foo() {
        // ...
    }
})();         // End scoping function
</script>

98
+1 स्पष्ट रूप से इसे विंडो में घोषित करना सबसे पठनीय तरीका है।
कैस्पर क्लेजेन

8
ध्यान दें कि windowनोड का उपयोग करने से काम नहीं चलेगा। यहाँ सबसे आसान ट्रिक सेट करना है: GLOBAL.window = GLOBAL;- जैसा कि इस संबंधित प्रश्न में बताया गया है । बेशक, यह बहुत वैचारिक नहीं है। मैं चीजों को दूसरे तरीके से करना पसंद करता हूं, इसलिए मैं GLOBALइसके बजाय उपयोग कर सकता हूं window
डोमी

4
@CasparKleijne, मैं इसे नहीं समझता। जब आप वस्तुतः कोई सबूत नहीं है कि खिड़की वस्तु वास्तव में मौजूद है, तो आप इसे खिड़की पर क्यों असाइन करेंगे। आपको पता नहीं है कि भविष्य में आपके कोड का उपयोग कैसे किया जाएगा। यह आपके नोड के बजाय MongoDB वातावरण या रिनो में भी उपयोग किया जा सकता है। और विंडो ऑब्जेक्ट ब्राउज़र में भी दिखाई नहीं देता है यदि आप उदाहरण के लिए वेब वर्कर्स का उपयोग करते हैं। यह पुन: प्रयोज्य को पूरी तरह से मार देगा।
घूमर

4
window.yourGlobalVariable = ...;स्टैक साइट पर 5 से 6 प्रश्न पढ़ने के बाद एक आकर्षण की तरह काम करता है।
अहमद सैयद

6
@JacquesKoekemoer: वहाँ कोई कारण नहीं है जो भी evalवहाँ का उपयोग करने के लिए है। इसके बजाय:window[dynamic_variable_name] = dynamic_variable_value;
TJ Crowder

19

UPDATE1: यदि आप टिप्पणियों को पढ़ते हैं तो इस विशेष नामकरण सम्मेलन के आसपास एक अच्छी चर्चा होती है।

UPDATE2: ऐसा लगता है कि जब से मेरा जवाब पोस्ट किया गया है नामकरण सम्मेलन अधिक औपचारिक हो गया है। जो लोग पढ़ाते हैं, किताबें लिखते हैं आदि varघोषणा और functionघोषणा के बारे में बोलते हैं ।

UPDATE3: यहां अतिरिक्त विकिपीडिया पोस्ट है जो मेरी बात का समर्थन करती है: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions

... और मुख्य प्रश्न का उत्तर देने के लिए। अपने कार्य से पहले चर घोषित करें। यह काम करेगा और यह गुंजाइश के शीर्ष पर अपने चर घोषित करने के अच्छे अभ्यास का पालन करेगा :)


7
यदि आप अपने चर को कहीं और परिभाषित करना चाहते हैं तो यह समझना सुनिश्चित करें कि उत्थापन क्या है। यहाँ इसके बारे में एक बहुत अच्छा लेख है पर्याप्त रूप सेCom/2/JavaScript- Scoping-and- Histing । सौभाग्य!
op1ekun

1
यह वही नहीं है definitionऔर declarationसी में मतलब आप सबसे पहले तो एक घोषणा या परिभाषा (जहां यह है के आधार पर) हो सकता है; दूसरा सिर्फ एक असाइनमेंट है। एक घोषणा सिर्फ पहचानकर्ता (यानी। myVarएक int) की व्याख्या को निर्दिष्ट करती है ; अगर घोषणा भी भंडारण का भंडार है, यह एक है definition। यह टाइप करने के लिए असंबंधित है; यह इस बात का हिस्सा है कि संकलन इकाइयाँ अन्य संकलन इकाइयों के संदर्भों को कैसे समझती हैं।
EML

4
जेएस में भी, घोषणाvar myVar कहा जाता है (इसे टाइप करने की आवश्यकता नहीं है) और एक असाइनमेंट । मैंने कंपाउंड ( ) के लिए "डिफिनिटेशन" शब्द सुना है । myVar = 10var myVar = 10;
बरगी

2
यह सवाल का जवाब देने में मदद नहीं करता है। यह एक टिप्पणी होनी चाहिए थी, जवाब नहीं।
स्टनटडूड

2
@Stuntddude तुम शायद सही हो :( मैंने सवाल का जवाब देना शुरू कर दिया और फिर थोड़ा विचलन करने का फैसला किया, और अच्छी तरह से यही हमें मिला है। फिर भी कुछ ppl अभी भी इसे उपयोगी पाते हैं इसलिए मैंने इसे यहाँ छोड़ दिया है। धन्यवाद प्रतिक्रिया!
op1ekun

15

बस घोषणा करते हैं

var trialImage;

बाहर। फिर

function makeObj(address) {
    trialImage = [address, 50, 50];
..
..
}

उम्मीद है की यह मदद करेगा।


12

नहीं, आप नहीं कर सकते। बस फ़ंक्शन के बाहर चर घोषित करें। जैसे ही आप मूल्य निर्दिष्ट करते हैं, आपको इसे घोषित करने की आवश्यकता नहीं होती है:

var trailimage;

function makeObj(address) {
  trailimage = [address, 50, 50];

1
माफ़ करना! "क्या जावास्क्रिप्ट फ़ंक्शन में वैश्विक चर को परिभाषित करना संभव है?" - "नहीं, आप नहीं कर सकते" सही नहीं है, जैसा कि पहले उत्तर से पता चलता है!
मुस्तफा .0x

5
@ mustafa.0x: आप गलत हैं। आप किसी फ़ंक्शन के अंदर एक वैश्विक चर को परिभाषित नहीं कर सकते । आप स्पष्ट रूप से एक वैश्विक चर बना सकते हैं , या एक फ़ंक्शन के अंदर एक विंडो प्रॉपर्टी बना सकते हैं, लेकिन आप किसी फ़ंक्शन के अंदर वैश्विक चर को परिभाषित नहीं कर सकते।
गुफ़ा १a

1
एक ब्राउज़र वातावरण में जावास्क्रिप्ट के संबंध में, एक वैश्विक चर और एक संपत्ति windowपर्यायवाची हैं। किसी भी तरह से, आपके द्वारा किए जा रहे शब्दार्थ भेद स्पष्ट हैं, इसलिए मैं अन-डाउनवॉटिंग को बुरा नहीं मानता। संपादित करें: मेरे वोट को बदलने में असमर्थ, क्षमा करें!
मुस्तफा .0x 19

2
यदि आप सख्त उपयोग नहीं कर रहे हैं (लेकिन तुम क्यों सख्त उपयोग नहीं कर रहे?), आप वास्तव में कर सकते हैं की घोषणा और एक समारोह के अंदर वैश्विक वार्स परिभाषित सब अच्छा प्रथाओं के खिलाफ जा रहा है और अभी का उपयोग नहीं द्वारा var, जो है Guffa से क्या मतलब परोक्ष बनाने (जैसे @ द्रुवपत्थक ने वहाँ बताया, साथ ही)।
क्रैगॉक्स

11

बस इसे फ़ंक्शन के बाहर घोषित करें, और फ़ंक्शन के अंदर मान असाइन करें। कुछ इस तरह:

<script type="text/javascript">
    var offsetfrommouse = [10, -20];
    var displayduration = 0;
    var obj_selected = 0;
    var trailimage = null ;  // GLOBAL VARIABLE
    function makeObj(address) {
        trailimage = [address, 50, 50];  //ASSIGN VALUE

या केवल फ़ंक्शन के अंदर अपने चर नाम से "var" को हटाना भी इसे वैश्विक बनाता है, लेकिन क्लीनर कोड के लिए इसे एक बार बाहर घोषित करना बेहतर होता है। यह भी काम करेगा:

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;

function makeObj(address) {
    trailimage = [address, 50, 50];  //GLOBAL VARIABLE , ASSIGN VALUE

मुझे आशा है कि यह उदाहरण अधिक बताता है: http://jsfiddle.net/qCrGE/

var globalOne = 3;
testOne();

function testOne()
{
    globalOne += 2;
    alert("globalOne is : " + globalOne );
    globalOne += 1;
}

alert("outside globalOne is : " + globalOne);

testTwo();

function testTwo()
{
    globalTwo = 20;
    alert("globalTwo is " + globalTwo);
    globalTwo += 5;
}

alert("outside globalTwo is :" + globalTwo);

3

यह फ़ंक्शन के बाहर ट्रेलिमेज वैरिएबल को परिभाषित करने के लिए बहुत सरल है और मेकओज फ़ंक्शन में इसका मान सेट करता है। अब आप इसके मूल्य को कहीं से भी एक्सेस कर सकते हैं।

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage;
function makeObj(address) {
      trailimage = [address, 50, 50];
      ....
}

2
    var Global = 'Global';

    function LocalToGlobalVariable() {

    //This creates a local variable.

    var Local = '5';

    //Doing this makes the variable available for one session
    //(a page refresh - Its the session not local)

    sessionStorage.LocalToGlobalVar = Local;

    // It can be named anything as long as the sessionStorage references the local variable.
    // Otherwise it won't work
    //This refreshes the page to make the variable take effect instead of the last variable set.

    location.reload(false);
    };

    //This calls the variable outside of the function for whatever use you want.

    sessionStorage.LocalToGlobalVar;

मुझे लगता है कि इसमें बहुत सी सिंटैक्स त्रुटियां हैं, लेकिन इसका सामान्य विचार है ... इस बात को इंगित करने के लिए बहुत अधिक धन्यवाद। आप यह पा सकते हैं कि http: //www.w3schools पर स्थानीय और सत्र संग्रहण क्या है । कॉम / html / html5_webstorage.asp । मुझे अपने कोड के लिए समान चीज़ की आवश्यकता है और यह वास्तव में अच्छा विचार था।


अब तक यह एकमात्र उत्तर है जो सभी पर काम करता है, लेकिन इसके लिए पृष्ठ को फिर से लोड करना पड़ता है और location.reload(false);पृष्ठ को बार-बार ताज़ा करना पड़ता है ।
इरिन

1

क्लासिक उदाहरण:

window.foo = 'bar';

IIFE का उपयोग करके सर्वोत्तम अभ्यास के बाद आधुनिक, सुरक्षित उदाहरण :

;(function (root) {
    'use strict'

    root.foo = 'bar';
)(this));

आजकल, WebStorage API का उपयोग करने का विकल्प भी है

localStorage.foo = 42;

या

sessionStorage.bar = 21;

प्रदर्शन के अनुसार, मुझे यकीन नहीं है कि यह चर में मूल्यों को संग्रहीत करने की तुलना में काफी धीमा है।

व्यापक ब्राउज़र समर्थन के रूप में पर कहा सकता कि मैं उपयोग ...


LocalStorage और sessionStorage केवल स्ट्रिंग मानों के लिए काम करता है।
HereToLearn_

यह सही है, @HereToLearn_, लेकिन तब आप उपयोग कर सकते हैं localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });और var foo = JSON.decode(localStorage.foo);
लार्स सिरप ब्रिंक नीलसन

localStorageवैश्विक चर के साथ क्या करना है?
मिशैल पेरोलाकोव्स्की

1
ओपी इस समस्या के समाधान की तलाश में है: "मैं अन्य कार्यों में ट्रेलिमेज वैरिएबल (मेकबज फंक्शन में घोषित) का उपयोग करना चाहता हूं।" कौन कहता है कि समाधान में वैश्विक चर को शामिल करना है? वैश्विक चर कुछ भी करने के लिए एक अच्छा समाधान हैं।
लार्स सिरप ब्रिंक नीलसन

0

तो आप फ़ंक्शन के बाहर उपलब्ध फ़ंक्शन के अंदर चर चाहते हैं? फ़ंक्शन के अंदर चर के परिणाम क्यों नहीं लौटाते हैं? var x = function returnX { var x = 0; return x; }विचार है ...

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
    <title></title>
    <script type="text/javascript">

        var offsetfrommouse = [10, -20];
        var displayduration = 0;
        var obj_selected = 0;

        function makeObj(address) {
            var trailimage = [address, 50, 50];
            document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0"  style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
            obj_selected = 1;
            return trailimage;
        }

        function truebody() {
            return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
        }

        function hidetrail() {
            var x = document.getElementById("trailimageid").style;
            x.visibility = "hidden";
            document.onmousemove = "";
        }

        function followmouse(e) {
            var xcoord = offsetfrommouse[0];
            var ycoord = offsetfrommouse[1];
            var x = document.getElementById("trailimageid").style;
            if (typeof e != "undefined") {
                xcoord += e.pageX;
                ycoord += e.pageY;
            }

            else if (typeof window.event != "undefined") {
                xcoord += truebody().scrollLeft + event.clientX;
                ycoord += truebody().scrollTop + event.clientY;
            }
            var docwidth = 1395;
            var docheight = 676;
            if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
                x.display = "none";
                alert("inja");
            }
            else
                x.display = "";
            x.left = xcoord + "px";
            x.top = ycoord + "px";
        }

        if (obj_selected = 1) {
            alert("obj_selected = true");
            document.onmousemove = followmouse;
            if (displayduration > 0)
                setTimeout("hidetrail()", displayduration * 1000);
        }

    </script>
</head>
<body>
    <form id="form1" runat="server">
    <img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px; top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
    </form>
</body>
</html>

मैंने इसका परीक्षण नहीं किया है, लेकिन यदि आपके कोड ने उस छोटे परिवर्तन से पहले काम किया है, तो उसे काम करना चाहिए।


-1

यहाँ एक नमूना कोड है जो सहायक हो सकता है।

  var Human = function(){
   name = "Shohanur Rahaman";  // global variable
   this.name = "Tuly"; // constructor variable 
   var age = 21;
 };

  var shohan = new Human();

 document.write(shohan.name+"<br>");
 document.write(name);
 document.write(age); // undefined cause its local variable 

यहाँ मुझे एक अच्छा उत्तर मिला कि कैसे-कैन-वन-डिक्लेयर-ए-ग्लोबल-वैरिएबल-इन-जावास्क्रिप्ट


जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
रोहित गुप्ता

-1

वैश्विक चर का उपयोग किए बिना चर को अन्य कार्यों में उपलब्ध कराने की एक और आसान विधि है:

function makeObj() {
  // var trailimage = 'test';
  makeObj.trailimage = 'test';
}
function someOtherFunction() {
  document.write(makeObj.trailimage);
}

makeObj();
someOtherFunction();


-2

यदि आप एक स्टार्टअप फ़ंक्शन कर रहे हैं, तो आप इस तरह से वैश्विक कार्यों और चर को परिभाषित कर सकते हैं:

function(globalScope)
{
     //define something
     globalScope.something() { 
         alert("It works");
     };
}(window)

क्योंकि इस तर्क के साथ समारोह को वैश्विक स्तर पर आमंत्रित किया गया है, इसलिए यह वैश्विक गुंजाइश है। तो, कुछ एक वैश्विक चीज होनी चाहिए।


thisहै undefinedएक समारोह सख्त मोड बाहर में और वैश्विक वस्तु का उल्लेख करने के लिए नहीं किया जाना चाहिए।
मिशैल पेरोलाकोव्स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.