কীভাবে জাভাস্ক্রিপ্টে বিশ্বব্যাপী পরিবর্তনশীল ঘোষণা করবেন?


উত্তর:


215

যদি আপনাকে উত্পাদন কোডে বিশ্বব্যাপী ভেরিয়েবলগুলি উত্পন্ন করতে হয় (যা এড়ানো উচিত) সর্বদা তাদের স্পষ্টভাবে ঘোষণা করুন :

window.globalVar = "This is global!";

যদিও এটা ঠিক বাদ দ্বারা একটি বিশ্বব্যাপী পরিবর্তনশীল সংজ্ঞায়িত করা সম্ভব var(অভিমানী সেখানে একই নামের কোন স্থানীয় পরিবর্তনশীল), এমনটি একটি উত্পন্ন অন্তর্নিহিত বিশ্বব্যাপী, যা একটি খারাপ জিনিস করতে হয় এবং একটি ত্রুটি উৎপন্ন হবে কঠোর মোডে


windowশুধুমাত্র ব্রাউজারে উপলব্ধ। এটিকে সমস্ত পরিবেশে কাজ করার জন্য আপনি কি উত্তরটি সম্পাদনা করতে পারবেন? দেখুন জাভাস্ক্রিপ্ট বৈশ্বিক বস্তুর পেতে কিভাবে?
মিশা পেরেকোভস্কি

52

আপনি যদি এই ভেরিয়েবলটি ব্যবহার করতে যাচ্ছেন তবে এটিই যদি অ্যাপ্লিকেশন হয় তবে ফেলিক্সের দৃষ্টিভঙ্গি দুর্দান্ত। তবে আপনি যদি jQuery প্লাগইন লিখছেন তবে "নেমস্পেসিং" (পরে উদ্ধৃতিতে বিশদ ...) ভেরিয়েবল এবং jQuery অবজেক্টের অধীনে প্রয়োজনীয় ফাংশন বিবেচনা করুন। উদাহরণস্বরূপ, আমি বর্তমানে একটি jQuery পপআপ মেনুতে কাজ করছি যা আমি মিনিমেনু বলেছি। সুতরাং, আমি miniMenujQuery এর অধীনে একটি "নেমস্পেস" সংজ্ঞায়িত করেছি এবং আমি সবকিছু সেখানে রেখেছি।

আমি যখন জাভাস্ক্রিপ্ট নেমস্পেসগুলি নিয়ে কথা বলি তখন उद्धरणগুলি ব্যবহার করার কারণটি হ'ল এগুলি সত্যিকার অর্থে স্বাভাবিক অর্থে নেমস্পেস নয়। পরিবর্তে, আমি কেবল একটি জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করি এবং আমার সমস্ত ফাংশন এবং ভেরিয়েবলগুলি এই বস্তুর বৈশিষ্ট্য হিসাবে রাখি।

এছাড়াও, সুবিধার জন্য, আমি সাধারণত প্লাগইনের iমধ্যে অভ্যন্তরীণভাবে ব্যবহার করা উচিত এমন স্টাফগুলির জন্য একটি নেমস্পেসের সাথে প্লাগইন নেমস্পেসটি সাব-স্পেস করে রাখি, যাতে এটি প্লাগইন ব্যবহারকারীর কাছ থেকে আড়াল করা যায়।

এটা এভাবে কাজ করে:

// An object to define utility functions and global variables on:
$.miniMenu = new Object(); 
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();

এখন আমি ঠিক করতে পারি $.miniMenu.i.globalVar = 3বা $.miniMenu.i.parseSomeStuff = function(...) {...}যখনই আমার বিশ্বব্যাপী কিছু সংরক্ষণ করার প্রয়োজন হয় এবং আমি এখনও এটি বিশ্বব্যাপী নেমস্পেসের বাইরে রাখি।


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

এটি পুরোপুরি ভাল কাজ করে! @ টমাস যেমন বলেছে তেমনটি নিশ্চিত হয়ে নিন, আপনার নিজস্ব কাস্টম ফাংশন বা ভেরিয়েবলের জন্য নিজের শ্রেণি / ধারক তৈরি করুন। +1
পিয়েরে

থমাস ধন্যবাদ! যদি আর প্রয়োজন হয় না, তবে প্যারেন্ট অবজেক্ট (যেমন delete $.miniMenu:) মুছুন । ঠিক আছে?
কুঞ্জ

1
@ কুঞ্জ: অবশ্যই, যে কোনও কিছুর সাথে: আপনি যদি গ্যারান্টি দিতে পারেন যে এটি আর ব্যবহার করা হবে না, এটি মুছে ফেলা নিরাপদ। যাইহোক, জাভাস্ক্রিপ্ট ইচ্ছা আবর্জনা, আপনার জন্য সংগ্রহ যাতে আপনি না আছে থেকে delete $.miniMenu
টমাস আসচান

20

সম্পাদনা করুন প্রশ্নটি জাভাস্ক্রিপ্ট সম্পর্কে, উত্তরটি jQuery সম্পর্কে, যা ভুল। এটি যখনই jQuery বিস্তৃত ছিল তখন থেকে এটি একটি পুরানো উত্তর।

পরিবর্তে, আমি জাভাস্ক্রিপ্টে বুদ্ধিমান স্কোপ এবং ক্লোজারগুলির প্রস্তাব দিই

পুরানো, খারাপ উত্তর: jQuery দিয়ে আপনি কেবল এটি করতে পারেন, ঘোষণার জায়গা যেখানেই হোক না কেন:

$my_global_var = 'my value';

এবং সর্বত্র পাওয়া যাবে। আমি তাড়াতাড়ি চিত্র গ্যালারী তৈরির জন্য এটি ব্যবহার করি, যখন চিত্রগুলি বিভিন্ন জায়গায় ছড়িয়ে দেওয়া হয়:

$gallery = $('img');
$current = 0;

$gallery.each(function(i,v){
    // preload images
    (new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
    $current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
    $current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});

টিপ : এই পৃষ্ঠায় কনসোলে পুরো কোডটি চালান ;-)


3
$ গ্যালারী এবং $ বর্তমান কেবল সাধারণ গ্লোবাল ভেরিয়েবল নয়? তারা কাজ করে কারণ আপনি তাদের 'ভার' বাদ দিয়ে গ্লোবাল ভেরিয়েবল হিসাবে সংজ্ঞায়িত করছেন তবে তাদের সামনে ডলার সাইন তাদের 'জিকুয়েরি ভেরিয়েবল' তৈরি করে না ... এটি আক্ষরিক অর্থে তাদের থেকে আন্ডারস্কোর বা অন্য কোনও চিহ্ন রাখার মতো as ... আপনি jQuery অবজেক্ট ($) ব্যবহার করে এবং এতে একটি সম্পত্তি যুক্ত করলে সেগুলি jQuery পরিবর্তনশীল হবে: my .myGlobalVariable = 'আমার মান' ...
এন্ড্রেস

আপনি সম্ভবত সঠিক, তবে লক্ষ্য করার মতো বিষয় হ'ল $ myVar সিনট্যাক্স ব্যবহার করে আপনি ২ টি অ্যাডভেঞ্জেটস পেয়েছেন, ১) ভেরিয়েবলটি কোনও বিশেষ ঘোষণা ছাড়াই বৈশ্বিক (besides ছাড়াও); এবং 2) আপনি কোডের অভ্যন্তরে খুব সহজেই আপনার গ্লোবাল ভেরিয়েবলগুলি ট্র্যাক করতে পারেন। যদিও আলোচনার জন্য উন্মুক্ত ...
এসিডে

একটি বিভ্রান্ত উত্তর। অ্যান্ড্রেসের সাথে সম্মত হন, এটি মোটেও jQuery পরিবর্তনশীল নয়। আপনি যদি $current = 0;ফাংশনটি শুরুতে সংজ্ঞায়িত না করেন তবে পরবর্তী কোনওটি কাজ করবে না।
হরর্রারি

15

এখানে আপনার বৈশ্বিক পরিবর্তনশীলের একটি বেসিক উদাহরণ যা আপনার বাকী বাক্যগুলি অ্যাক্সেস করতে পারে। এখানে আপনার জন্য একটি সরাসরি উদাহরণ: http://jsfiddle.net/fxCE9/

var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);


function myFunction1() {
    myVariable = 'Hello 1';
}

function myFunction2() {
    myVariable = 'Hello 2';
}

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


বিশ্বব্যাপী চলকগুলি কীভাবে এখনও jQuery এ কাজ করে তার সেরা উত্তর।
ক্লিনটন সবুজ

1
আমি জানি আমি গভীর খনন করছি তবে এটি এমনকি সুস্পষ্ট বৈশ্বিক পরিবর্তনশীলও নয়। এটি একটি ভাগ করা পাবলিক ভেরিয়েবলের সাথে সুর মিলিয়ে অত্যন্ত ছোট স্ক্রিপ্টগুলির জন্য বন্ধ করে দেওয়া হয় না। এগুলি দুটি সম্পূর্ণ ভিন্ন পদ্ধতি / ব্যবহার এবং আপনি যদি বিভিন্ন স্ক্রিপ্টের মাঝামাঝি কোনও স্ক্রিপ্টে একটি স্পষ্টত বিশ্বব্যাপী ঘোষণা করেন তবে এটি আপনাকে বড় সমস্যায় ফেলবে। আমি কেবল আমার দলটির প্রথম প্রান্তকেই স্ক্রিপ্টের শীর্ষে একটি বিশ্বব্যাপী পরিবর্তনশীল হিসাবে ঘোষণা করতে পারি যা ডওমে ডাকা হয় th
ব্রায়ান এলিস

4

ফাংশনের বাইরে চলকটি ঘোষণা করুন

function dosomething(){
  var i = 0; // can only be used inside function
}

var i = '';
function dosomething(){
  i = 0; // can be used inside and outside the function
}

3

সবচেয়ে ভাল উপায় হ'ল ব্যবহার করা closures, কারণ windowবস্তুটি খুব, খুব বৈশিষ্ট্যযুক্ত বিশৃঙ্খল হয়ে যায়।

এইচটিএমএল

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js ( এই উত্তরের ভিত্তিতে )

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

এখানে plnkr । আশা করি এটি সাহায্য করবে!

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