কোনও ফাংশনটির অভ্যন্তরে কিছু ভেরিয়েবল ঘোষিত কেন অন্য ফাংশনে উপলব্ধ হয়ে যায়, অন্যরা রেফারেন্স ত্রুটির ফলে হয়?


158

কোনও ফাংশনের অভ্যন্তরে ঘোষিত হওয়ার পরে কেন ভেরিয়েবলগুলি এত অদ্ভুত আচরণ করে তা বুঝতে পারি না।

  1. ইন firstফাংশন আমি ডিক্লেয়ার letভেরিয়েবল bএবং cমান 10 :

    b = c = 10;

    ইন secondফাংশন আমি দেন:

    b + ", " + c

    এবং এটি দেখায়:

    10, 10
  2. এছাড়াও firstফাংশন আমি ঘোষণা aমান 10 :

    let a = b = c = 10;

    তবে secondফাংশনে এটি একটি ত্রুটি দেখায়:

    ভেরিয়েবল খুঁজে পাচ্ছেন না: a

  3. এখন firstফাংশনটিতে আমি 20d মান দিয়ে ঘোষণা করি :

    var d = 20;

    তবে secondফাংশনে এটি আগের মতো একই ত্রুটি দেখায়, তবে ভেরিয়েবলের সাথে d:

    ভেরিয়েবল খুঁজে পাচ্ছেন না: d

উদাহরণ:

function first() {
  let a = b = c = 10;
  var d = 20;
  second();
}

function second() {
  console.log(b + ", " + c); //shows "10, 10"

  try{ console.log(a); }  // Rreference error
  catch(e){ console.error(e.message) }

  try{ console.log(d); } // Reference error
  catch(e){ console.error(e.message) }
}
first()


31
আপনি globals ঘোষণা করছি, যেহেতু bএবং cপ্রিফিক্স নেই varশব্দ। aএবং dস্থানীয় হয় first
ভিএলএজ ২

1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এটি একটি ভাল সাক্ষাত্কারের প্রশ্ন হবে কিনা তা নিয়ে একটি স্পর্শকাতর কথোপকথন আড্ডায় আর্কাইভ করা হয়েছে ।
কোডি গ্রে

1
এটি আমাকে ভিজ্যুয়াল বেসিকের অনুরূপ পরিস্থিতির কথা মনে করিয়ে দেয়; Dim Apple, Banana, Pear As Fruitমানে Dim Apple / Dim Banana / Dim Pear As Fruit, এবং না Dim Apple As Fruit / ...
এরিক লিপার্ট

উত্তর:


179

এর কারণ আপনি আসলে বলছেন:

c = 10;
b = c;
let a = b;

আপনি যা বলছেন বলে মনে করছেন তা নয়, যা হ'ল:

let a = 10;
let b = 10;
let c = 10;

আপনি খেয়াল করবেন যে আপনি আপনার চেইনে কতগুলি পরিবর্তনশীল যুক্ত করুন তা নয়, এটি কেবল প্রথম (ক) হবে যা ত্রুটির কারণ হয়ে দাঁড়ায়।

এর কারণ এটি হ'ল "চলুন" ব্লকটিতে আপনার পরিবর্তনশীল (বা "স্থানীয়ভাবে", কমপক্ষে "বন্ধনী" এর অর্থ ") যেখানে আপনি এটি ঘোষণা করেন তা স্কোপ করে।

আপনি যদি "লেট" ছাড়াই কোনও ভেরিয়েবল ঘোষণা করেন তবে এটি বিশ্বব্যাপী ভেরিয়েবলটিকে সরিয়ে দেয়।

সুতরাং, আপনি যেখানে আপনার ভেরিয়েবলগুলি সেট করেছেন সেই ফাংশনে, 10 এর মান পাওয়া যায় (আপনি ব্রেকপয়েন্ট রাখলে আপনি এটি ডিবাগারে দেখতে পাবেন)। আপনি যদি প্রথম ফাংশনে a, b, c এর জন্য একটি কনসোল লগ রাখেন, সমস্ত কিছু ঠিক আছে।

তবে আপনি এই ফাংশনটি ছাড়ার সাথে সাথে প্রথমটি (ক) - এবং আবার মনে রাখবেন, প্রযুক্তিগতভাবে নির্ধারিত ক্রমে, এটি সর্বশেষটি - "অদৃশ্য হয়ে গেছে" (আবারও, আপনি এটিতে দেখতে পারেন) আপনি যদি দ্বিতীয় ফাংশনে ব্রেকপয়েন্ট নির্ধারণ করেন তবে ডিবাগার), তবে অন্য দুটি (বা যদিও আপনি যুক্ত করেন) এখনও উপলব্ধ।

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

এটি ব্যবহার করে দেখুন: "চলুন" কীওয়ার্ডটি সরিয়ে দিন। আপনার সমস্ত যুদ্ধ এখন উপলব্ধ হবে।

"ভের" এর একইরকম স্থানীয়-স্কোপ প্রভাব রয়েছে, তবে ভেরিয়েবলটি কীভাবে "উত্তোলন করা হয়" তার থেকে পৃথক হয়, এটি অবশ্যই আপনার বোঝা উচিত, তবে যা আপনার প্রশ্নের সাথে সরাসরি জড়িত নয়।

(বিটিডাব্লু, এই প্রশ্নটি এটির পক্ষে একটি ভাল তৈরি করতে যথেষ্ট প্রো জেএস ডেভসকে স্টম্প করবে)।

জেএস-এ কীভাবে ভেরিয়েবলগুলি ঘোষণা করা যায় তার পার্থক্যের সাথে আপনি দৃ spend়তার সাথে সময় কাটাতে দৃ suggest়ভাবে পরামর্শ দিন: কোনও কীওয়ার্ড ছাড়াই, "লেট" এবং "ভ্যার" দিয়ে।


4
এটি একই সাথে প্রোগ্রামিংয়ের সেরা এবং সবচেয়ে খারাপ জিনিস: আপনি যা করতে বলবেন কম্পিউটার ঠিক তা করবে। আপনি এটি করতে বলার ইচ্ছা কি তা অগত্যা নয়। প্রোগ্রামগুলি নিখুঁত। আমরা সমস্যা তৈরি।
নেট দ্য ডার্ক আবসোল

8
@ থিভস আপনি এই উত্তরের প্রসঙ্গে কেন সুপারিশ varকরেন let? আমি বুঝতে পারছি না।
ক্লেকন

4
@ থিওগুলি আমি আপনার সাথে দৃ strongly়ভাবে একমত নই। varযদি অযত্নে ব্যবহার করা হয় তবে বাগগুলি প্রবণ হতে পারে। এই ভাজাটি দেখুন
সিডে

2
@ তারা কোন ক্ষেত্রে কোন সুবিধা varআছে ? একটি আধুনিক প্রেক্ষাপটে যখন উভয় অপশন এবং আমি কোডটি এক জন্য জিজ্ঞেস করছি আমার নির্মল যাক উচিত লিখুন। আমি যখন এটি আগে জিজ্ঞাসা করেছি তখন আমি "আপনি একটি ভেরিয়েবল পুনরায় ঘোষণা করতে পারবেন" সম্পর্কে উত্তর পেয়েছি সেই ক্ষেত্রে আমাকে লোকজনকে মনে করিয়ে দিতে হবে যে আপনাকে ভেরিয়েবলগুলি পুনরায় ঘোষণা করা উচিত নয় । কোডটির যুক্তিতে এটি কোনও ত্রুটি বা ত্রুটি - তাই পুনরায় ঘোষণার সুবিধাটি হ'ল ... এটি আপনাকে ত্রুটিযুক্ত কোড লিখতে দেয়। আমি এখনো ওপর সন্তুষ্ট হয়েছেন যে কোন যুক্তিসম্মত কারণ দেখতে করেছি যখন একটি বিকল্প। letvarvarlet
VLAZ

2
জাভাস্ক্রিপ্টের বিরুদ্ধে আরও একটি চিহ্ন চক আপ করুন। স্থানীয় হিসাবে ঘোষিত না হলে সমস্ত ভেরিয়েবল বৈশ্বিক। :(
জেআরই

68

ফাংশনে first(), ভেরিয়েবলগুলি bএবং cব্যবহার না করে varবা উড়তে তৈরি করা হয় let

let a = b = c = 10; // b and c are created on the fly

এর চেয়ে আলাদা

let a = 10, b = 10, c = 10; // b and c are created using let (note the ,)

তারা অন্তর্নিহিত গ্লোবাল হয়ে। এ কারণেই তারা এতে উপলব্ধsecond()

ডকুমেন্টেশন থেকে

অঘোষিত ভেরিয়েবলের মান নির্ধারণ করা যখন অ্যাসাইনমেন্টটি কার্যকর করা হয় তখন এটি গ্লোবাল ভেরিয়েবল (এটি বৈশ্বিক বস্তুর সম্পত্তি হয়ে যায়) হিসাবে স্পষ্টতই তৈরি করে।

এটি এড়াতে, আপনি "use strict"যখন অঘোষিত ভেরিয়েবল ব্যবহার করেন তখন ত্রুটিগুলি সরবরাহ করে এমনটি আপনি ব্যবহার করতে পারেন

"use strict"; // <-------------- check this

function first() {
   /*
    * With "use strict" c is not defined.
    * (Neither is b, but since the line will be executed from right to left,
    * the variable c will cause the error and the script will stop)
    * Without, b and c become globals, and then are accessible in other functions
    */
   let a = b = c = 10;
   var d = 20;
   second();
}

function second() {
   console.log(b + ", " + c); //reference error
   console.log(a); //reference error
   console.log(d); //reference error
}

first();


15
তদতিরিক্ত: let a = 10, b = 10, c = 10;অথবা let a, b, c; a = b = c = 10;অন্যথায় ভেরিয়েবলগুলি ঘোষণার সঠিক উপায়।
রিকার্ড ইলিমি ২ää

সুতরাং কঠোর মোডের সাথে, চলক বি সম্পর্কে কী হবে?
টিক 20

2
@ টিক ২০ ভেরিয়েবলটি bমূল্যায়ন / পৌঁছানো হবে না, ত্রুটিটি লাইনে উপস্থিত হবে let a = b = c = 10;, ডান থেকে বামে পড়বে । cপ্রথম পরিবর্তনশীল কারণ ReferenceErrorহওয়ায়, লাইনের বাকী অংশটি কার্যকর করা হবে না (স্ক্রিপ্টটি বন্ধ হয়ে গেছে)
সিড

2
এর মতো let a = 10, b = a, c = b;
কিছুটিও

8
মূলত "ব্যবহার কঠোর" জন্য upvated। একটি সাক্ষাত্কার প্রশ্নের প্রসঙ্গে, এটিও এই কোডটিতে আমার মন্তব্যের শুরু হবে।
প্যাক 0

23

বিষয়গুলিকে অদ্ভুত বলার আগে প্রথমে কিছু বেসিকটি জেনে নেওয়া যাক:

var এবং let উভয় জাভাস্ক্রিপ্টে পরিবর্তনশীল ঘোষণার জন্য ব্যবহৃত হয়। উদাহরণ স্বরূপ,

var one = 1;
let two = 2;

চলকগুলিও ব্যবহার না করে varবা ঘোষিত হতে পারে let। উদাহরণ স্বরূপ,

three = 3;

এখন উপরোক্ত পদ্ধতির মধ্যে পার্থক্য হ'ল:

var ফাংশন scoped হয়

এবং

let ব্লক স্কোপড হয়।

যখন ভেরিয়েবল এর সুযোগ ঘোষণা ছাড়া var/ letপরিণত শব্দ বিশ্বব্যাপী যেখানে এটি ঘোষিত হয় নির্বিশেষে।

ওয়েব পৃষ্ঠার যে কোনও জায়গা থেকে গ্লোবাল ভেরিয়েবলগুলি অ্যাক্সেস করা যায় (প্রস্তাবিত নয় কারণ গ্লোবালগুলি দুর্ঘটনাক্রমে সংশোধন করা যেতে পারে)।

এখন এই ধারণাগুলি অনুসারে আসুন প্রশ্নে থাকা কোডটি একবার দেখুন:

 function first() {
   let a = b = c = 10;
   /* The above line means:
    let a=10; // Block scope
    b=10; // Global scope
    c=10; // Global scope
    */

   var d = 20; // Function scope
   second();
}

function second() {
   alert(b + ", " + c); // Shows "10, 10" //accessible because of global scope
   alert(a); // Error not accessible because block scope has ended
   alert(d); // Error not accessible because function scope has ended
}

1
আপনি জোনো জেমসের উত্তরের অংশ চুরি করেছিলেন । কেন?
পিটার মর্টেনসেন

2
আমি দুঃখিত তবে আমার তেমন কোনও অভিপ্রায় ছিল না, অনুরূপ কিছু সেখানে থাকতে পারে কারণ আমরা একই উত্স থেকে এক টুকরো তথ্য সংগ্রহ করেছি।
ফাতেমাসজাদ

2
এটি উভয় জবাবগুলিতে আপাত উদ্ধৃতি ব্যতীত একই মূল উত্স থেকে অনুলিপি করা সামগ্রী থাকতে পারে - সম্ভবত টিউটোরিয়ালটিচার্জার / জাভাস্ক্রিপ্ট / জাভাস্ক্রিপ্ট-পরিবর্তনযোগ্য । চৌর্যবৃত্তির উপস্থিতি স্পষ্ট, যেহেতু ব্যাকরণগত ত্রুটিটি মূল থেকে পুনরুত্পাদন করা হয় - "var মূল শব্দটি ব্যতীত ঘোষিত ভেরিয়েবলের পরিধি বিশ্বব্যাপী পরিণত হয় যেখানেই এটি ঘোষিত হয় না হয় " হয় হয় "সুযোগ ... হওয়া উচিত " বা " scopes ... হয়ে " । অন্য কারও হুবহু শব্দ ব্যবহার করার জন্য উদ্ধৃতি প্রয়োজন, এখান থেকে বা অন্য কোথাও। meta.stackexchange.com/q/160071/211183
মাইকেল - sqlbot

ধন্যবাদ বলছি, আমি উত্সটির জন্য একটি রেফারেন্স লিঙ্ক যুক্ত করেছি।
ফাতেমাসজাদ

6

মূলশব্দটি ব্যবহার করে চলকগুলি letকেবলমাত্র ব্লকের আওতায় থাকা উচিত এবং এটি কোনও বাহ্যিক ক্রিয়ায় পাওয়া যায় না ...

প্রতিটি ভেরিয়েবল যা আপনি সেই পদ্ধতিতে ঘোষণা করছেন তা ব্যবহার করছে না letবা করছে না var। আপনি ভেরিয়েবলের ঘোষণায় একটি কমা অনুপস্থিত।

কীওয়ার্ড ছাড়াই ভেরিয়েবল ঘোষণার পরামর্শ দেওয়া হয় নাvar । এটি দুর্ঘটনাক্রমে একটি বিদ্যমান বৈশ্বিক চলক ওভাররাইট করতে পারে। varকীওয়ার্ড ব্যতীত ঘোষিত ভেরিয়েবলের ব্যাপ্তি বিশ্বব্যাপী পরিণত হয় তা নির্ধারিত নির্বিশেষে where ওয়েব পৃষ্ঠার যে কোনও জায়গা থেকে গ্লোবাল ভেরিয়েবলগুলি অ্যাক্সেস করা যায়।

function first() {
   let a = 10;
   let b = 10;
   let c = 10;
   var d = 20;
   second();
}

function second() {
   console.log(b + ", " + c); //shows "10, 10"
   console.log(a); //reference error
   console.log(d); //reference error
}

first();


3

এটি যখন আপনি ব্যবহার করবেন না letবা varতারপরে ভেরিয়েবলগুলি উড়ানের দিকে ঘোষিত হতে থাকে , আপনি আরও নীচের মত ঘোষণা করেন।

let a = 10;
let b = 10;
let c = 10;

2

অদ্ভুত সমস্যাটি জাভাস্ক্রিপ্টে স্কোপিং বিধিগুলির কারণে ঘটে

function first() {
   let a = b = c = 10; // a is in local scope, b and c are in global scope
   var d = 20; // d is in local scope
   second(); // will have access to b and c from the global scope
}

ধরে নিই যে আপনি একই মান (100) থেকে প্রাথমিক 3 স্থানীয় ভেরিয়েবল ঘোষণা করতে চান । আপনার প্রথম () নীচের মত দেখতে হবে। এই ক্ষেত্রে, দ্বিতীয় () এর কোনও ভেরিয়েবলের অ্যাক্সেস থাকবে না কারণ তারা স্থানীয় () এ প্রথম স্থানীয়

function first() {
   let a = 100; // a is in local scope init to 100
   let b = a; // b is in local scope init to a
   let c = b // c is in local scope init to b

   var d = 20; // d is in local scope
   second(); // will not have access a, b, c, or d
}

তবে আপনি যদি বিশ্বব্যাপী পরিবর্তনশীল চান তবে আপনার প্রথম () নীচের মত দেখাবে। এই ক্ষেত্রে, দ্বিতীয়টির সমস্ত ভেরিয়েবলের অ্যাক্সেস থাকবে কারণ তারা বিশ্বব্যাপী সুযোগে

function first() {
   a = 100; // a is in global scope
   b = a; // b is in global scope
   c = b // c is in global scope

   d = 20; // d is in global scope
   second(); // will have access to a, b, c, and d from the global scope
}

স্থানীয় ভেরিয়েবল (যেমন ঘোষিত কোড ব্লকের অ্যাক্সেসযোগ্য)।
একটি কোড ব্লক এর মধ্যে কোডের লাইন (গুলি) সহ যে কোনও।।।

  • ফাংশন () {var, চলুন, এখানে কনট সম্পূর্ণ ফাংশনে অ্যাক্সেসযোগ্য},
  • () এর জন্য এখানে বৈকল্পিক বাহ্যিক সুযোগে অ্যাক্সেসযোগ্য, আসুন, কেবল এখানেই অ্যাক্সেসযোগ্য},
  • প্রভৃতি

গ্লোবাল ভেরিয়েবল (বৈশ্বিক সুযোগে অ্যাক্সেসযোগ্য)।
এই পরিবর্তনগুলি গ্লোবাল অবজেক্টের সাথে সংযুক্ত রয়েছে। বিশ্বব্যাপী অবজেক্টটি পরিবেশ নির্ভর। এটি ব্রাউজারগুলির উইন্ডো অবজেক্ট।

বিশেষ দ্রষ্টব্য: আপনি জাভাস্ক্রিপ্টে ভেরিয়েবলগুলি ভেরি, লেট, কনট কীওয়ার্ড ব্যবহার না করে ঘোষণা করতে পারেন। এইভাবে ঘোষিত একটি পরিবর্তনশীল বৈশ্বিক বস্তুর সাথে সংযুক্ত, সুতরাং বৈশ্বিক সুযোগে অ্যাক্সেসযোগ্য।
a = 100 // is valid and is in global scope

আরও পড়ার জন্য কিছু নিবন্ধ: https://www.sitepPoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/ বোঝাবোধ-scope-in- জাভাস্ক্রিপ্ট https: //www.digitalocean .com / সম্প্রদায় / টিউটোরিয়াল / বুঝতে-ভেরিয়েবল-স্কোপ-উত্তোলন-ইন-জাভাস্ক্রিপ্ট


0

মূল পার্থক্য হ'ল স্কোপিংয়ের নিয়ম। Var কীওয়ার্ড দ্বারা ঘোষিত ভেরিয়েবলগুলি তাত্ক্ষণিক ফাংশন বডি (তাই ফাংশন স্কোপ) এ স্কোপ করা হয় এবং ভেরিয়েবলগুলি immediate} (তাই ব্লকের সুযোগ) দ্বারা চিহ্নিত তাত্ক্ষণিকভাবে বন্ধ করা ব্লককে স্কোপ করা হয়। এবং যখন আপনি বলেন

c = 10;
b = c;
let a = b;

গ এবং খ এর মজাদার জীবনকাল যেমন রয়েছে কেবল তার একটি ব্লক স্প্যান রয়েছে এবং আপনি যদি এটিতে রেফারেন্স দিয়ে একটি অ্যাক্সেস করার চেষ্টা করেন তবে সর্বদা ত্রুটি দেখায় কিন্তু সি এবং বি বিশ্বব্যাপী তাই তারা তা করে না You আপনি খেয়াল করবেন যে কতই না গুরুত্বপূর্ণ আপনার চেইনে আপনি যে ভেরিয়েবলগুলি যুক্ত করেন, এটি কেবল প্রথম (ক) যা ত্রুটির কারণ ঘটায়। এটি কারণ "চলুন" আপনার ব্লকটিকে (বা "স্থানীয়ভাবে", কমপক্ষে "বন্ধনীতে" বা কম অর্থ) স্কোপ করে) যার মধ্যে আপনি এটি ঘোষণা করেন I আপনি যদি "লেট" ছাড়াই কোনও ভেরিয়েবল ঘোষণা করেন তবে এটি বিশ্বব্যাপী পরিবর্তনশীলকে স্কোপ করে o সুতরাং, আপনি যেখানে আপনার ভেরিয়েবলগুলি সেট করেছেন সেই ফাংশনে, সমস্ত মান 10 পেয়ে যায় (আপনি এটি ডিবাগারে দেখতে পারেন যদি আপনি একটি চাপ দেন তবে ব্রেক পয়েন্ট)। যদি আপনি প্রথম ফাংশনে a, b, c এর জন্য একটি কনসোল লগ রাখেন তবে সবকিছু ঠিক আছে B তবে আপনি এই ফাংশনটি ছাড়ার সাথে সাথে প্রথমটি (ক) - এবং আবার মনে রাখবেন,


0

এখানে জাভাস্ক্রিপ্টে পরিবর্তনশীল ঘোষণার 3 আকর্ষণীয় দিক রয়েছে:

  1. var এটির সংজ্ঞা দেওয়া ব্লকের ক্ষেত্রে ভেরিয়েবলের সুযোগকে সীমাবদ্ধ করে। ( 'ভার' স্থানীয় সুযোগের জন্য)

  2. কোনও ব্লকের অভ্যন্তরে বাহ্যিক ভেরিয়েবলের মানকে অস্থায়ীভাবে ওভাররাইড করার অনুমতি দেয়।

  3. কেবলমাত্র ছাড়া একটি পরিবর্তনশীল প্রকাশক Var বা দিন পরিবর্তনশীল বৈশ্বিক করা, যেখানে এটি ঘোষিত হয় নির্বিশেষে হবে।

এখানে আসুন একটি ডেমো , যা ভাষার সর্বশেষতম সংযোজন:

// File name:  let_demo.js

function first() {
   a = b = 10
   console.log("First function:    a = " + a)
   console.log("First function:    a + b = " + (a + b))
}

function second() {
    let a = 5
    console.log("Second function:    a = " + a)
    console.log("Second function:    a + b = " + (a + b))
}

first()   

second()

console.log("Global:    a = " + a)
console.log("Global:    a + b = " + (a + b))

আউটপুট:

$ node let_demo.js 

First function:    a = 10
First function:    a + b = 20

Second function:    a = 5
Second function:    a + b = 15

Global:    a = 10
Global:    a + b = 20

ব্যাখ্যা:

ভেরিয়েবল একটি এবং 'ভিতরে delcared হয়েছে () প্রথম ', var ছাড়া বা কীওয়ার্ড যাক।

অতএব, এবং গ্লোবাল, এবং তাই, পুরো প্রোগ্রাম জুড়ে অ্যাক্সেসযোগ্য।

নামে ফাংশন ইন দ্বিতীয় ' , বিবৃতি ' একটি = 5 দিন ' সাময়িকভাবে মান সেট করে' একটি 'থেকে' 5 ', শুধুমাত্র ফাংশন সুযোগ মধ্যে।

' সেকেন্ড () ' এর বাইরে , আইই, বিশ্বব্যাপী স্কোপে ' ' এর মান আগে সংজ্ঞায়িত করা হবে।

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