কীভাবে জাভাস্ক্রিপ্টে গ্লোবাল ভেরিয়েবল এড়ানো যায়?


85

আমরা সকলেই জানি যে গ্লোবাল ভেরিয়েবলগুলি সর্বোত্তম অনুশীলন ছাড়া কিছু নয় are কিন্তু বেশ কয়েকটি উদাহরণ রয়েছে যখন এগুলি ছাড়া কোড করা কঠিন। গ্লোবাল ভেরিয়েবলের ব্যবহার এড়াতে আপনি কোন কৌশল ব্যবহার করেন?

উদাহরণস্বরূপ, নিম্নলিখিত দৃশ্যের পরিপ্রেক্ষিতে আপনি কীভাবে বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করবেন না?

জাভাস্ক্রিপ্ট কোড:

var uploadCount = 0;

window.onload = function() {
    var frm = document.forms[0];

    frm.target = "postMe";
    frm.onsubmit = function() {
        startUpload();
        return false;
    }
}

function startUpload() {
    var fil = document.getElementById("FileUpload" + uploadCount);

    if (!fil || fil.value.length == 0) {
        alert("Finished!");
        document.forms[0].reset();
        return;
    }

    disableAllFileInputs();
    fil.disabled = false;
    alert("Uploading file " + uploadCount);
    document.forms[0].submit();
}

প্রাসঙ্গিক মার্কআপ:

<iframe src="test.htm" name="postHere" id="postHere"
  onload="uploadCount++; if(uploadCount > 1) startUpload();"></iframe>

<!-- MUST use inline JavaScript here for onload event
     to fire after each form submission. -->

এই কোডটি একাধিক সহ একটি ওয়েব ফর্ম থেকে আসে <input type="file">। বিশাল অনুরোধ রোধ করতে এটি একবারে ফাইলগুলি আপলোড করে। এটি iframe- এ পোস্ট করে এটি করে , প্রতিক্রিয়াটির জন্য অপেক্ষা করে যা iframe অনলোডটি জ্বালিয়ে দেয় এবং তারপরে পরবর্তী জমা দেয়।

আপনাকে এই উদাহরণটির বিশেষভাবে জবাব দিতে হবে না, আমি কেবলমাত্র এমন পরিস্থিতির উল্লেখের জন্য এটি সরবরাহ করছি যা আমি বৈশ্বিক পরিবর্তনশীলগুলি এড়ানোর উপায় সম্পর্কে ভাবতে অক্ষম।


4
তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (IIFE) ব্যবহার করুন আপনি এখানে আরও পড়তে পারেন: codearsenal.net/2014/11/…

উত্তর:


70

সবচেয়ে সহজ উপায় হ'ল আপনার কোডটি একটি ক্লোপ এ মোড়ানো এবং বিশ্বব্যাপী আপনার প্রয়োজন কেবল সেই পরিবর্তনশীলগুলি বিশ্বব্যাপী উন্মুক্ত করুন:

(function() {
    // Your code here

    // Expose to global
    window['varName'] = varName;
})();

ক্রিসেন্ট ফ্রেশের মন্তব্যকে সম্বোধন করার জন্য: পুরোপুরি দৃশ্য থেকে বিশ্বব্যাপী ভেরিয়েবলগুলি অপসারণ করতে বিকাশকারীকে প্রশ্নে ধরে নেওয়া বেশ কয়েকটি জিনিস পরিবর্তন করতে হবে। এটি দেখতে আরও অনেক বেশি লাগবে:

জাভাস্ক্রিপ্ট:

(function() {
    var addEvent = function(element, type, method) {
        if('addEventListener' in element) {
            element.addEventListener(type, method, false);
        } else if('attachEvent' in element) {
            element.attachEvent('on' + type, method);

        // If addEventListener and attachEvent are both unavailable,
        // use inline events. This should never happen.
        } else if('on' + type in element) {
            // If a previous inline event exists, preserve it. This isn't
            // tested, it may eat your baby
            var oldMethod = element['on' + type],
                newMethod = function(e) {
                    oldMethod(e);
                    newMethod(e);
                };
        } else {
            element['on' + type] = method;
        }
    },
        uploadCount = 0,
        startUpload = function() {
            var fil = document.getElementById("FileUpload" + uploadCount);

            if(!fil || fil.value.length == 0) {    
                alert("Finished!");
                document.forms[0].reset();
                return;
            }

            disableAllFileInputs();
            fil.disabled = false;
            alert("Uploading file " + uploadCount);
            document.forms[0].submit();
        };

    addEvent(window, 'load', function() {
        var frm = document.forms[0];

        frm.target = "postMe";
        addEvent(frm, 'submit', function() {
            startUpload();
            return false;
        });
    });

    var iframe = document.getElementById('postHere');
    addEvent(iframe, 'load', function() {
        uploadCount++;
        if(uploadCount > 1) {
            startUpload();
        }
    });

})();

এইচটিএমএল:

<iframe src="test.htm" name="postHere" id="postHere"></iframe>

আপনার কোনও ইনলাইন ইভেন্ট হ্যান্ডলারের প্রয়োজন নেই<iframe> , এটি এখনও এই কোড সহ প্রতিটি লোডে আগুন জ্বালাবে।

লোড ইভেন্ট সম্পর্কিত

এখানে একটি পরীক্ষার কেস দেখানো হচ্ছে যে আপনার কোনও ইনলাইন onloadইভেন্টের প্রয়োজন নেই। এটি একই সার্ভারে কোনও ফাইল (/emptypage.php) রেফারেন্স করার উপর নির্ভর করে, অন্যথায় আপনি কেবল এটি একটি পৃষ্ঠায় আটকানো এবং এটি চালাতে সক্ষম হবেন।

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>untitled</title>
</head>
<body>
    <script type="text/javascript" charset="utf-8">
        (function() {
            var addEvent = function(element, type, method) {
                if('addEventListener' in element) {
                    element.addEventListener(type, method, false);
                } else if('attachEvent' in element) {
                    element.attachEvent('on' + type, method);

                    // If addEventListener and attachEvent are both unavailable,
                    // use inline events. This should never happen.
                } else if('on' + type in element) {
                    // If a previous inline event exists, preserve it. This isn't
                    // tested, it may eat your baby
                    var oldMethod = element['on' + type],
                    newMethod = function(e) {
                        oldMethod(e);
                        newMethod(e);
                    };
                } else {
                    element['on' + type] = method;
                }
            };

            // Work around IE 6/7 bug where form submission targets
            // a new window instead of the iframe. SO suggestion here:
            // http://stackoverflow.com/q/875650
            var iframe;
            try {
                iframe = document.createElement('<iframe name="postHere">');
            } catch (e) {
                iframe = document.createElement('iframe');
                iframe.name = 'postHere';
            }

            iframe.name = 'postHere';
            iframe.id = 'postHere';
            iframe.src = '/emptypage.php';
            addEvent(iframe, 'load', function() {
                alert('iframe load');
            });

            document.body.appendChild(iframe);

            var form = document.createElement('form');
            form.target = 'postHere';
            form.action = '/emptypage.php';
            var submit = document.createElement('input');
            submit.type = 'submit';
            submit.value = 'Submit';

            form.appendChild(submit);

            document.body.appendChild(form);
        })();
    </script>
</body>
</html>

সতর্কতাটি প্রতিবারই আমি সাফারি, ফায়ারফক্স, আই 6, 7 এবং 8 এর জমা বোতামটি ক্লিক করি click


অথবা একরকম অ্যাক্সেসর সরবরাহ করুন। আমি রাজী.
আপারস্পটেজ

4
লোকেরা যখন ভোটের নিচে নামার জন্য তাদের যুক্তি ব্যাখ্যা করার জন্য তাদের পক্ষে ভোট দেয় তখন এটি সহায়ক।
চোখের পলকহীনতা

6
আমি ভোট দিয়েছি না। যাইহোক, উইন্ডো বলার ['varName'] = varName বন্ধের বাইরে একটি বিশ্বব্যাপী বর্ণ ঘোষণা করার মতো। var foo = "bar"; (function() { alert(window['foo']) })();
জোশ স্টোডোলা

আপনি শিরোনামের উত্তর দিয়েছেন, প্রশ্ন নয়। আমি এটা পছন্দ করি না। ইনলাইন ইভেন্ট হ্যান্ডলারের রেফারেন্সের প্রসঙ্গে ক্লোজার আইডিয়মটি রাখা (যেভাবে প্রশ্নের মাংস পাচ্ছে) আরও ভাল হত।
ক্রিসেন্ট টাটকা

4
ক্রিসেন্ট ফ্রেশ, আমি প্রশ্নের উত্তর দিয়েছি। বিশ্বব্যাপী ক্রিয়াকলাপ এড়ানোর জন্য প্রশ্নের অনুমানগুলি পুনরায় ডিজাইন করা দরকার। এই উত্তরটি একটি গাইডলাইন হিসাবে, প্রশ্নের অনুমানগুলি (উদাহরণস্বরূপ একটি ইনলাইন ইভেন্ট হ্যান্ডলার) গ্রহণ করে এবং বিকাশকারীকে সবকিছু বিশ্বব্যাপী সুযোগের পরিবর্তে কেবলমাত্র প্রয়োজনীয় বৈশ্বিক অ্যাক্সেস পয়েন্টগুলি বেছে নিতে দেয়।
চোখের পলকহীনতা

60

আমি মডিউল প্যাটার্ন প্রস্তাব ।

YAHOO.myProject.myModule = function () {

    //"private" variables:
    var myPrivateVar = "I can be accessed only from within YAHOO.myProject.myModule.";

    //"private" method:
    var myPrivateMethod = function () {
        YAHOO.log("I can be accessed only from within YAHOO.myProject.myModule");
    }

    return  {
        myPublicProperty: "I'm accessible as YAHOO.myProject.myModule.myPublicProperty."
        myPublicMethod: function () {
            YAHOO.log("I'm accessible as YAHOO.myProject.myModule.myPublicMethod.");

            //Within myProject, I can access "private" vars and methods:
            YAHOO.log(myPrivateVar);
            YAHOO.log(myPrivateMethod());

            //The native scope of myPublicMethod is myProject; we can
            //access public members using "this":
            YAHOO.log(this.myPublicProperty);
        }
    };

}(); // the parens here cause the anonymous function to execute and return

4
আমি +1 করব কারণ আমি এটি বুঝতে পেরেছি এবং এটি চূড়ান্ত সহায়ক, তবে আমি কেবল একটি বৈশ্বিক চলক ব্যবহার করি এমন পরিস্থিতিতে এটি কতটা কার্যকর হবে তা সম্পর্কে এখনও আমি অস্পষ্ট। আমি ভুল হলে আমাকে সংশোধন করুন, তবে এই ফাংশনটি সম্পাদন করে এবং এটি ফিরিয়ে দেওয়ার ফলে বস্তুটি ফিরে আসার কারণ হয়ে থাকে YAHOO.myProject.myModuleযা একটি বৈশ্বিক পরিবর্তনশীল। ঠিক?
জোশ স্টোডোলা

11
@ জোশ: বিশ্বব্যাপী পরিবর্তনশীল মন্দ নয়। গ্লোবাল ভেরিয়েবল__ই খারাপ। যতটা সম্ভব গ্লোবাল গণনা রাখুন।
এরেনন

পুরো বেনাম ফাংশনটি প্রতিবারই আপনি 'মডিউলগুলি' জনসাধারণের সম্পত্তি / পদ্ধতিগুলির মধ্যে যে কোনও একটিতে অ্যাক্সেস করতে চান তা কার্যকর করা হবে?
আপক্রিক

@ ইউপি-ক্রিক: না, তা হবে না। এটি কেবল একবার কার্যকর করা হয়, যখন প্রোগ্রামটি শেষ লাইনে ক্লোজিং () এর মুখোমুখি হয় এবং প্রত্যাবর্তিত অবজেক্টটি আমারপ্রাইভেটওয়ার এবং মাইপ্রাইভেটমেথোডযুক্ত ক্লোজারের সাথে মাইমডুল সম্পত্তিতে অর্পিত হবে।
এরেনন

সুন্দরী, ঠিক আমিও যা খুঁজছিলাম। এটি আমার jquery ইভেন্ট হ্যান্ডলিং থেকে আমার পৃষ্ঠা যুক্তিকে আলাদা করতে দেয়। একটি প্রশ্ন, এক্সএসএসের আক্রমণে একজন আক্রমণকারীটির এখনও YAHOO.myProject.myModule অ্যাক্সেস থাকতে পারে? কেবলমাত্র বাইরের ফাংশনটি নামহীন রেখে একটি () রেখে দেওয়া কি ভাল হবে না; শেষে, around (দস্তাবেজ) এর চারপাশে। পাশাপাশি প্রস্তুত? হতে পারে YAHOO.myProct.myModule বৈশিষ্ট্যগুলির মেটা অবজেক্টে পরিবর্তন? আমি স্রেফ জেএস থিওরিতে বেশ কিছুটা সময় ব্যয় করেছি এবং এখনই এটি একসাথে ফিট করার চেষ্টা করছি।
ডেল

8

প্রথমত, বৈশ্বিক জাভাস্ক্রিপ্ট এড়ানো অসম্ভব, কিছু বিশ্বব্যাপী সর্বদা ঝুঁকির মধ্যে থাকবে। এমনকি আপনি যদি একটি নেমস্পেস তৈরি করেন যা এখনও একটি ভাল ধারণা, সেই নামস্থানটি বিশ্বব্যাপী হবে।

বৈশ্বিক সুযোগকে অপব্যবহার না করার জন্য অনেকগুলি পন্থা রয়েছে। সবচেয়ে সহজ দুটি হ'ল হয় ক্লোজার ব্যবহার করা, বা যেহেতু আপনার কেবলমাত্র একটি ভেরিয়েবল আপনার ট্র্যাক রাখতে হবে, কেবল এটি ফাংশনটির সম্পত্তি হিসাবে সেট করুন (যা staticভেরিয়েবল হিসাবে বিবেচনা করা যেতে পারে )।

বন্ধ

var startUpload = (function() {
  var uploadCount = 1;  // <----
  return function() {
    var fil = document.getElementById("FileUpload" + uploadCount++);  // <----

    if(!fil || fil.value.length == 0) {    
      alert("Finished!");
      document.forms[0].reset();
      uploadCount = 1; // <----
      return;
    }

    disableAllFileInputs();
    fil.disabled = false;
    alert("Uploading file " + uploadCount);
    document.forms[0].submit();
  };
})();

* নোট করুন যে এখানে ইনক্রিমেন্টিং uploadCountঅভ্যন্তরীণভাবে ঘটছে

ফাংশন সম্পত্তি

var startUpload = function() {
  startUpload.uploadCount = startUpload.count || 1; // <----
  var fil = document.getElementById("FileUpload" + startUpload.count++);

  if(!fil || fil.value.length == 0) {    
    alert("Finished!");
    document.forms[0].reset();
    startUpload.count = 1; // <----
    return;
  }

  disableAllFileInputs();
  fil.disabled = false;
  alert("Uploading file " + startUpload.count);
  document.forms[0].submit();
};

কেন uploadCount++; if(uploadCount > 1) ...প্রয়োজনীয় তা আমি নিশ্চিত নই , কারণ দেখে মনে হচ্ছে শর্তটি সর্বদা সত্য হবে। তবে আপনার যদি ভেরিয়েবলটিতে বিশ্বব্যাপী অ্যাক্সেসের প্রয়োজন হয়, তবে উপরে বর্ণিত ফাংশন সম্পত্তি পদ্ধতি আপনাকে ভেরিয়েবলটি আসলে বিশ্বব্যাপী না করে তা করার অনুমতি দেবে।

<iframe src="test.htm" name="postHere" id="postHere"
  onload="startUpload.count++; if (startUpload.count > 1) startUpload();"></iframe>

যাইহোক, যদি এটি হয় তবে আপনার সম্ভবত কোনও অবজেক্ট আক্ষরিক বা তাত্পর্যপূর্ণ অবজেক্টটি ব্যবহার করা উচিত এবং এটি স্বাভাবিক ওও পদ্ধতিতে করা উচিত (যেখানে আপনার অভিনবতাকে আঘাত করা হলে আপনি মডিউল প্যাটার্নটি ব্যবহার করতে পারেন)।


4
আপনি একেবারে বৈশ্বিক সুযোগ এড়াতে পারেন। আপনার 'সমাপ্তি' উদাহরণে, কেবল শুরু থেকে 'var startUpload =' সরান, এবং এই ফাংশনটি পুরোপুরি বন্ধ হয়ে যাবে, বৈশ্বিক স্তরে কোনও অ্যাক্সেসযোগ্যতা ছাড়াই। অনুশীলনে, অনেক লোক একটি একক পরিবর্তনশীল প্রকাশ করতে পছন্দ করেন, যার মধ্যে সমস্ত কিছুর উল্লেখ রয়েছে
derrylwc

4
@derrylwc এই ক্ষেত্রে, startUploadআপনি উল্লেখ করছেন যে একক পরিবর্তনশীল। সরানো হচ্ছে var startUpload = অবসান উদাহরণ থেকে এর মানে হল যে ভেতরের ফাংশন নিষ্পন্ন করা হবে পারবে না এটা কোন রেফারেন্স না থাকায়। গ্লোবাল স্কোপ দূষণ এড়ানোর বিষয়টি অভ্যন্তরীণ কাউন্টার ভেরিয়েবলের সাথে সম্পর্কিত uploadCountযা ব্যবহার করে startUpload। তদুপরি, আমি মনে করি যে ওপি অভ্যন্তরীণভাবে ব্যবহৃত uploadCountভেরিয়েবলের সাথে এই পদ্ধতির বাইরে কোনও সুযোগকে দূষিত করার চেষ্টা করছে ।
জাস্টিন জনসন

বেনামে বন্ধের মধ্যে কোড যদি আপলোডারটিকে ইভেন্ট শ্রোতা হিসাবে যুক্ত করে, অবশ্যই যথাযথ ঘটনাটি ঘটলে এটি "সম্পাদন করতে সক্ষম হবে"।
দামিয়ান ইয়ারিক 24'18

6

কখনও কখনও এটি জাভাস্ক্রিপ্টে বৈশ্বিক চলকগুলি বোধগম্য করে। তবে তাদের সরাসরি উইন্ডো থেকে ঝুলতে দেবেন না।

পরিবর্তে, আপনার গ্লোবালগুলি ধারণ করতে একটি একক "নেমস্পেস" অবজেক্ট তৈরি করুন। বোনাস পয়েন্টগুলির জন্য, আপনার পদ্ধতিগুলি সহ সমস্ত কিছু সেখানে রাখুন।


আমি এটা কিভাবে করবো? আমার গ্লোবালগুলি ধারণ করতে একটি একক নামস্থান অবজেক্ট তৈরি করতে চান?
p.matsinopoulos

5
window.onload = function() {
  var frm = document.forms[0];
  frm.target = "postMe";
  frm.onsubmit = function() {
    frm.onsubmit = null;
    var uploader = new LazyFileUploader();
    uploader.startUpload();
    return false;
  }
}

function LazyFileUploader() {
    var uploadCount = 0;
    var total = 10;
    var prefix = "FileUpload";  
    var upload = function() {
        var fil = document.getElementById(prefix + uploadCount);

        if(!fil || fil.value.length == 0) {    
            alert("Finished!");
            document.forms[0].reset();
            return;
         }

        disableAllFileInputs();
        fil.disabled = false;
        alert("Uploading file " + uploadCount);
        document.forms[0].submit();
        uploadCount++;

        if (uploadCount < total) {
            setTimeout(function() {
                upload();
            }, 100); 
        }
    }

    this.startUpload = function() {
        setTimeout(function() {
            upload();
        }, 100);  
    }       
}

আমি কীভাবে ইফ্রেমে আমার onloadহ্যান্ডলারের ভিতরে আপলোডকন্ট বাড়িয়ে দেব ? এটি অত্যন্ত গুরুত্বপূর্ণ।
জোশ স্টোডোলা

4
ঠিক আছে, আমি এখানে আপনি কি করেছেন তা দেখতে পাচ্ছি। দুর্ভাগ্যক্রমে এটি এক নয়। এটি সমস্ত আপলোডকে আলাদাভাবে জ্বালিয়ে দেয় তবে একই সাথে (প্রযুক্তিগতভাবে, এর মধ্যে 100 মিমি থাকে)। বর্তমান সমাধান সেগুলি ক্রমিকভাবে আপলোড করে, যার অর্থ প্রথম আপলোডটি শেষ না হওয়া পর্যন্ত দ্বিতীয় আপলোড শুরু হবে না। এজন্য ইনলাইন onloadহ্যান্ডলারটি প্রয়োজন। প্রোগ্রামালিকভাবে হ্যান্ডলারটি নির্ধারণ করা কার্যকর হয় না, কারণ এটি কেবল প্রথমবারেই গুলি চালায়। ইনলাইন হ্যান্ডলারটি প্রতিবার ফায়ার করে (যে কোনও কারণেই হোক)।
জোশ স্টোডোলা

যদিও আমি এখনও +1 এ যাচ্ছি, কারণ আমি দেখতে পাচ্ছি যে এটি বিশ্বব্যাপী ভেরিয়েবলটি লুকানোর একটি কার্যকর পদ্ধতি
জোশ স্টোডোলা

পৃথক কলব্যাকগুলি বজায় রাখতে আপনি প্রতিটি আপলোডের জন্য একটি আইফ্রেম তৈরি করতে পারেন।
জাস্টিন জনসন 20

4
আমি মনে করি এটি শেষ পর্যন্ত একটি দুর্দান্ত উত্তর, নির্দিষ্ট উদাহরণের প্রয়োজনীয়তা দ্বারা সামান্য সামান্য মেঘলা। মূলত ধারণাটি হ'ল একটি টেম্পলেট (অবজেক্ট) তৈরি করা এবং এটি ইনস্ট্যান্ট করার জন্য 'নতুন' ব্যবহার করা। এটি সম্ভবত সেরা উত্তর কারণ এটি সত্যিকার অর্থে কোনও বিশ্বব্যাপী পরিবর্তনশীল অর্থাৎ আপোস ছাড়াই এড়িয়ে চলে
পান্ডাওড

3

এটি করার অন্য উপায় হ'ল একটি অবজেক্ট তৈরি করা এবং তারপরে এটিতে পদ্ধতি যুক্ত করা।

var object = {
  a = 21,
  b = 51
};

object.displayA = function() {
 console.log(object.a);
};

object.displayB = function() {
 console.log(object.b);
};

এইভাবে, কেবলমাত্র 'অবজেক্ট' উন্মুক্ত করা হয় এবং এর সাথে সম্পর্কিত পদ্ধতিগুলি। এটি নামের জায়গায় যুক্ত করার সমতুল্য।


2

কিছু জিনিস বিশ্বব্যাপী নেমস্পেসে হতে চলেছে - যথা আপনি যে কোনও ফাংশন আপনার ইনলাইন জাভাস্ক্রিপ্ট কোড থেকে কল করছেন।

সাধারণভাবে, সমাধানটি হ'ল বন্ধের মধ্যে সমস্ত কিছু মোড়ানো:

(function() {
    var uploadCount = 0;
    function startupload() {  ...  }
    document.getElementById('postHere').onload = function() {
        uploadCount ++;
        if (uploadCount > 1) startUpload();
    };
})();

এবং ইনলাইন হ্যান্ডলারটি এড়িয়ে চলুন।


এই পরিস্থিতিতে ইনলাইন হ্যান্ডলারটি প্রয়োজনীয়। যখন ফর্মটি iframe এ জমা দেয়, আপনার অনলোডলোড হ্যান্ডলার সেটটি প্রোগ্রামিকভাবে আগুন দেয় না।
জোশ স্টোডোলা

4
@ জোশ: হু, সত্যি? iframe.onload = ...সমান নয় <iframe onload="..."কি?
ক্রিসেন্ট টাটকা

2

ছোট থেকে মাঝারি প্রকল্পের জন্য ক্লোজারগুলি ব্যবহার করা ঠিক আছে। তবে, বড় প্রকল্পগুলির জন্য, আপনি নিজের কোডটি মডিউলগুলিতে বিভক্ত করতে এবং এটিকে বিভিন্ন ফাইলে সংরক্ষণ করতে চাইতে পারেন।

তাই সমস্যা সমাধানের জন্য আমি jQuery সিক্রেট প্লাগইন লিখেছি ।

এই প্লাগইনটির সাথে আপনার ক্ষেত্রে কোডটি নীচের মতো দেখতে হবে।

জাভাস্ক্রিপ্ট:

// Initialize uploadCount.
$.secret( 'in', 'uploadCount', 0 ).

// Store function disableAllFileInputs.
secret( 'in', 'disableAllFileInputs', function(){
  // Code for 'disable all file inputs' goes here.

// Store function startUpload
}).secret( 'in', 'startUpload', function(){
    // 'this' points to the private object in $.secret
    // where stores all the variables and functions
    // ex. uploadCount, disableAllFileInputs, startUpload.

    var fil = document.getElementById( 'FileUpload' + uploadCount);

    if(!fil || fil.value.length == 0) {
        alert( 'Finished!' );
        document.forms[0].reset();
        return;
    }

    // Use the stored disableAllFileInputs function
    // or you can use $.secret( 'call', 'disableAllFileInputs' );
    // it's the same thing.
    this.disableAllFileInputs();
    fil.disabled = false;

    // this.uploadCount is equal to $.secret( 'out', 'uploadCount' );
    alert( 'Uploading file ' + this.uploadCount );
    document.forms[0].submit();

// Store function iframeOnload
}).secret( 'in', 'iframeOnload', function(){
    this.uploadCount++;
    if( this.uploadCount > 1 ) this.startUpload();
});

window.onload = function() {
    var frm = document.forms[0];

    frm.target = "postMe";
    frm.onsubmit = function() {
        // Call out startUpload function onsubmit
        $.secret( 'call', 'startUpload' );
        return false;
    }
}

প্রাসঙ্গিক মার্কআপ:

<iframe src="test.htm" name="postHere" id="postHere" onload="$.secret( 'call', 'iframeOnload' );"></iframe>

আপনার ফায়ারব্যাগ খুলুন , আপনি কোনও গ্লোবাল পাবেন না, এমনকি ফ্যানসিটনও পাবেন না :)

সম্পূর্ণ ডকুমেন্টেশনের জন্য, দয়া করে এখানে দেখুন

একটি ডেমো পৃষ্ঠার জন্য, দয়া করে দেখুন এই

গিটহাবের উত্স কোড


1

ক্লোজার ব্যবহার করুন। এরকম কিছু আপনাকে বিশ্বব্যাপী ব্যতীত অন্য সুযোগ দেয়।

(function() {
    // Your code here
    var var1;
    function f1() {
        if(var1){...}
    }

    window.var_name = something; //<- if you have to have global var
    window.glob_func = function(){...} //<- ...or global function
})();

অতীতে আমার পদ্ধতিটি ছিল একটি নির্দিষ্ট গ্লোবাল ভেরিয়েবল অবজেক্টকে সংজ্ঞায়িত করা এবং সেই সাথে সমস্ত গ্লোবাল ভেরিয়েবল সংযুক্ত করা। আমি কীভাবে এটি বন্ধ করে গুটিয়ে দেব? দুঃখের বিষয়, মন্তব্য বাক্সের সীমাটি আমাকে সাধারণ কোড এম্বেড করতে দেয় না।
ডেভিড এডওয়ার্ডস

1

স্বতন্ত্র বৈশ্বিক ভেরিয়েবলগুলি "সুরক্ষার" জন্য:

function gInitUploadCount() {
    var uploadCount = 0;

    gGetUploadCount = function () {
        return uploadCount; 
    }
    gAddUploadCount= function () {
        uploadCount +=1;
    } 
}

gInitUploadCount();
gAddUploadCount();

console.log("Upload counter = "+gGetUploadCount());

আমি জেএসের কাছে একজন নবজাতক, বর্তমানে এটি একটি প্রকল্পে ব্যবহার করছি। (আমি কোন মন্তব্য এবং সমালোচনা প্রশংসা)


1

আমি এটি এইভাবে ব্যবহার করি:

{
    var globalA = 100;
    var globalB = 200;
    var globalFunc = function() { ... }

    let localA = 10;
    let localB = 20;
    let localFunc = function() { ... }

    localFunc();
}

সমস্ত গ্লোবাল স্কোপের জন্য 'ভার' ব্যবহার করুন এবং স্থানীয় স্কোপের জন্য 'লেট' ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.