এর অর্থ কী যে বিশ্বব্যাপী নামস্থান দূষিত হবে?


92

এর অর্থ কী যে বিশ্বব্যাপী নামস্থান দূষিত হবে?

বিশ্বব্যাপী নেমস্পেস দূষিত হওয়ার অর্থ কী তা আমি সত্যিই বুঝতে পারি না।


4
ভবিষ্যতের রেফারেন্সের জন্য লিঙ্ক করা: জাভাস্ক্রিপ্ট
নেমস্পেস

উত্তর:


124

আবর্জনা সংগ্রহের বিষয়ে দ্রুত নোট

ভেরিয়েবলগুলি সুযোগ হারাতে থাকায় তারা আবর্জনা সংগ্রহের জন্য যোগ্য হবে। যদি এগুলি বিশ্বব্যাপী বাদ দেওয়া হয়, তবে বিশ্বব্যাপী নেমস্পেসের সুযোগটি হারা না হওয়া পর্যন্ত তারা সংগ্রহের জন্য যোগ্য হবেন না।

এখানে একটি উদাহরণ:

var arra = [];
for (var i = 0; i < 2003000; i++) {
 arra.push(i * i + i);
}

আপনার গ্লোবাল নেমস্পেসে এটি যুক্ত করার জন্য (কমপক্ষে আমার জন্য) 10,000 কিলো মেমরির ব্যবহার (উইন 7 ফায়ারফক্স) বিজ্ঞাপন করা উচিত যা সংগ্রহ করা হবে না। অন্যান্য ব্রাউজারগুলি এটিকে অন্যভাবে পরিচালনা করতে পারে।

স্কোপটিতে একই কোড থাকা যা এই ক্ষেত্রের বাইরে চলে যায়:

(function(){
 var arra = [];
 for (var i = 0; i < 2003000; i++) {
  arra.push(i * i + i);
 }
})();

অনুমতি দেবে arraঅবসান, executes পর সুযোগ হারান এবং আবর্জনা সংগ্রহের জন্য যোগ্য হতে।

গ্লোবাল নেমস্পেস আপনার বন্ধু

বিশ্বব্যাপী নেমস্পেস ব্যবহারের বিরুদ্ধে বহু দাবি সত্ত্বেও, এটি আপনার বন্ধু। এবং একটি ভাল বন্ধুর মতো, আপনার সম্পর্কের অপব্যবহার করা উচিত নয়।

ভদ্র হও

গ্লোবাল নেমস্পেসটি (সাধারণত "দূষণকারী" হিসাবে পরিচিত) অপব্যবহার করবেন না। এবং আমি গ্লোবাল নেমস্পেসের অপব্যবহার করে যা বোঝাতে চাইছি তা হল - একাধিক বৈশ্বিক ভেরিয়েবল তৈরি করবেন না। এখানে বিশ্বব্যাপী নেমস্পেস ব্যবহারের একটি খারাপ উদাহরণ।

var x1 = 5;
var x2 = 20;
var y1 = 3
var y2 = 16;

var rise = y2 - y1;
var run = x2 - x1;

var slope = rise / run;

var risesquared = rise * rise;
var runsquared = run * run;

var distancesquared = risesquared + runsquared;

var distance = Math.sqrt(dinstancesquared);

এটি 11 টি বৈশ্বিক ভেরিয়েবল তৈরি করতে চলেছে যা সম্ভবত কোথাও ওভাররাইট করা বা ভুল ধারণাযুক্ত হতে পারে।

রিসোর্সফুল হও

আরও কার্যকর উপায়, যা বিশ্বব্যাপী নেমস্পেসকে দূষিত করে না, তা হ'ল মডিউল প্যাটার্নে এগুলি আবৃত করা হবে এবং একাধিক ভেরিয়েবলের বহিঃপ্রকাশের সময় কেবল একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করা হবে।

এখানে একটি উদাহরণ রয়েছে: (দয়া করে নোট করুন এটি সহজ এবং কোনও ত্রুটি পরিচালনার ক্ষেত্রে নেই)

//Calculate is the only exposed global variable
var Calculate = function () {
 //all defintions in this closure are local, and will not be exposed to the global namespace
 var Coordinates = [];//array for coordinates
 var Coordinate = function (xcoord, ycoord) {//definition for type Coordinate
   this.x = xcoord;//assign values similar to a constructor
   this.y = ycoord;
  };

  return {//these methods will be exposed through the Calculate object
   AddCoordinate: function (x, y) {
   Coordinates.push(new Coordinate(x, y));//Add a new coordinate
  },

  Slope: function () {//Calculates slope and returns the value
   var c1 = Coordinates[0];
   var c2 = Coordinates[1];
   return c2.y - c1.y / c2.x - c1.x;//calculates rise over run and returns result
  },

  Distance: function () {
   //even with an excessive amount of variables declared, these are all still local
   var c1 = Coordinates[0];
   var c2 = Coordinates[1];

   var rise = c2.y - c1.y;
   var run = c2.x - c1.x;

   var risesquared = rise * rise;
   var runsquared = run * run;

   var distancesquared = risesquared + runsquared;

   var distance = Math.sqrt(distancesquared);

   return distance;
  }
 };
};

//this is a "self executing closure" and is used because these variables will be
//scoped to the function, and will not be available globally nor will they collide
//with any variable names in the global namespace
(function () {
 var calc = Calculate();
 calc.AddCoordinate(5, 20);
 calc.AddCoordinate(3, 16);
 console.log(calc.Slope());
 console.log(calc.Distance());
})();

10
ভেরিয়েবলগুলি বন্ধের ভিতরে রাখা নিশ্চিত করে যে তারা আবর্জনা সংগ্রহ করেছে।
জাভা

4
অত্যন্ত আকর্ষণীয় উত্তর, আপনি কী আমাদের ব্যাখ্যা করতে পারেন যে আপনার সুযোগের মতো করে একটি রিটার্ন ব্যবহার করে এবং Calculate.prototype.Slope()সুযোগের বাইরে যেমন উদাহরণস্বরূপ ব্যবহার করে কী পার্থক্য ? এই সমস্যাযুক্তের কাছাকাছি থাকা অন্য একটি ধারণাটি অবলম্বন করা খুব নিখুঁত হবে!
লুডো

এই ভাল ব্যাখ্যার জন্য ধন্যবাদ। তাত্ক্ষণিক প্রশ্ন: সেই স্নিপকেটে ত্রুটি-পরিচালনা সম্পর্কে আপনি কী দেখতে চান?
সেনটেনজা

@ সেনটেঞ্জা - এটির উপর নির্ভর করে যদি লাইনে কোনও ত্রুটি থাকে তবে কি হবে। যদি কিছু না হয়, তবে এটির সত্যিকার অর্থে ত্রুটি পরিচালনার দরকার নেই। যদি এটি গুরুত্বপূর্ণ হয়, তবে সম্ভবত 0 টি দিয়ে বিভাজন ঘটবে না তা নিশ্চিত করার জন্য কয়েকটি পরীক্ষা এবং একটি ব্যর্থ প্রচেষ্টা চিহ্নিত করার জন্য একটি বার্তা বা প্রতিক্রিয়া (কখনও কখনও এর অর্থ নিঃশব্দে ব্যর্থ হওয়া)। সংখ্যাগুলি আসলে সংখ্যা নয় এবং পাঠ্য নয় তা নিশ্চিত করার জন্য সম্ভবত কয়েকটি পরীক্ষা। যদিও সামগ্রিকভাবে, ত্রুটি পরিচালনা করা কোডটি কে ব্যবহার করছে তার উপরও নির্ভর করে। যদি এটি কেবল আপনি হয় তবে আপনি সম্ভবত নির্দিষ্ট ব্রেকিং যুক্তিগুলি পাস না করতে জানেন। এটিও বরং একটি সহজ উদাহরণ :)
ট্র্যাভিস জে

20

জাভাস্ক্রিপ্টে, কোনও ক্রিয়াকলাপের বাইরে ঘোষণাগুলি বিশ্বব্যাপী। এই ছোট উদাহরণ বিবেচনা করুন:

var x = 10;
function example() {
    console.log(x);
}
example(); //Will print 10

উপরের উদাহরণে, xবিশ্বব্যাপী ঘোষিত হয়। কোনও বাচ্চার সুযোগ, যেমন exampleফাংশন দ্বারা তৈরি করা হয়েছে , কার্যকরভাবে যে কোনও প্যারেন্ট স্কোপে ঘোষিত জিনিসগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় (এই ক্ষেত্রে এটি কেবল বিশ্বব্যাপী সুযোগ) scope

যে কোনও শিশু স্কোপ যা বৈশ্বিক স্কোপ হিসাবে ঘোষিত কোনও পরিবর্তনকে পুনরায় ঘোষনা করে তা গ্লোবাল ভেরিয়েবলকে ছায়া দিবে, সম্ভাব্যভাবে অবাঞ্ছিত এবং বাগগুলি ট্র্যাক করা শক্ত করে তোলে:

var x = 10;
function example() {
    var x = 20;
    console.log(x); //Prints 20
}
example();
console.log(x); //Prints 10

গ্লোবাল ভেরিয়েবলগুলি সাধারণত এ জাতীয় সমস্যা তৈরির সম্ভাবনার কারণে সুপারিশ করা হয় না। আমরা যদি ফাংশনের varভিতরে বিবৃতিটি ব্যবহার না exampleকরি, তবে আমরা দুর্ঘটনাক্রমে xবৈশ্বিক সুযোগের মানটি ওভাররাইট করে ফেলতাম:

var x = 10;
function example() {
    x = 20; //Oops, no var statement
    console.log(x); //Prints 20
}
example();
console.log(x); //Prints 20... oh dear

আপনি যদি আরও পড়তে চান এবং এটি সঠিকভাবে বুঝতে চান তবে আমি ECMAScript নির্দিষ্টকরণের মধ্য দিয়ে যাবার পরামর্শ দিই । এটি পঠনগুলির মধ্যে সবচেয়ে উত্তেজনাপূর্ণ নাও হতে পারে তবে এটি কোনও শেষই করবে না।


8

আপনি যখন গ্লোবাল ভেরিয়েবল, ফাংশন ইত্যাদি ঘোষণা করেন, এগুলি হ'ল গ্লোবাল নেমস্পেসে চলে যায়। পারফরম্যান্স / মেমরির সমস্যাগুলি (যা উত্থাপিত হতে পারে) বাদে আপনি সম্ভবত দুর্ভাগ্যজনক নাম সংঘর্ষে জড়িয়ে পড়বেন, যখন আপনি কোনও গুরুত্বপূর্ণ ভেরিয়েবলটিকে নতুন করে সংজ্ঞায়িত করবেন বা আপনি যে মূল্য ব্যবহার করেন বলে মনে করবেন না সেগুলি ব্যবহার করবেন না।

গ্লোবাল নেমস্পেসে জিনিসগুলির সংজ্ঞা দেওয়া এড়ানো উচিত।


4
গ্লোবাল নেমস্পেসে জিনিসগুলি সংজ্ঞায়িত করার উপায় হ'ল স্থানীয় ভেরিয়েবলগুলি (একটি ফাংশনের অভ্যন্তরে "var" দিয়ে ঘোষিত) ব্যবহার করা, তবে তার পরে ভেরিয়েবলটি ... ফাংশনের স্থানীয় হয়। এটি যথাসম্ভব করা উচিত।
স্টাফেন গ্লোন্ডু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.