[javascript] কিভাবে জাভাস্ক্রিপ্ট কাজ বন্ধ করে?


14 Answers

যখনই আপনি ফাংশন শব্দটিকে অন্য ফাংশনের মধ্যে দেখেন, অভ্যন্তরীণ ফাংশনটির বাইরের ফাংশনে ভেরিয়েবলগুলির অ্যাক্সেস থাকে।

function foo(x) {
  var tmp = 3;

  function bar(y) {
    console.log(x + y + (++tmp)); // will log 16
  }

  bar(10);
}

foo(2);

এটি সর্বদা 16 টি লগ ইন করবে, কারণ bar x অ্যাক্সেস করতে পারে যা foo একটি যুক্তি হিসাবে সংজ্ঞায়িত করা হয়েছে এবং এটি foo থেকে tmp অ্যাক্সেস করতে পারে।

যে একটি বন্ধ। একটি ফাংশন বন্ধ করার জন্য ফিরে আসতে হবে না। আপনার অবিলম্বে লিক্সিক সুযোগের বাইরে কেবলমাত্র ভেরিয়েবলগুলি অ্যাক্সেস করা বন্ধ করে দেয়

function foo(x) {
  var tmp = 3;

  return function (y) {
    console.log(x + y + (++tmp)); // will also log 16
  }
}

var bar = foo(2); // bar is now a closure.
bar(10);

উপরের ফাংশনটি 16 টি লগ ইন করবে, কারণ bar এখনও x এবং tmp উল্লেখ করতে পারে, যদিও এটি সরাসরি সুযোগের ভিতরে আর নেই।

যাইহোক, যেহেতু tmp এখনও bar বন্ধের ভিতরে ঝুলছে, এটিও বাড়ছে। আপনি bar কল যখন এটি বৃদ্ধি করা হবে।

একটি বন্ধ করার সবচেয়ে সহজ উদাহরণ এই হল:

var a = 10;
function test() {
  console.log(a); // will output 10
  console.log(b); // will output 6
}
var b = 6;
test();

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

তাদের একটি তালিকা ফেরত বা গ্লোবাল ভেরিয়েবল সেট করে, একাধিক বন্ধকরণ ফাংশন তৈরি করা সম্ভব। এই সমস্ত একই x এবং একই tmp , তারা তাদের নিজস্ব কপি করবেন না।

এখানে সংখ্যা x একটি আক্ষরিক সংখ্যা। জাভাস্ক্রিপ্টে অন্যান্য অক্ষরগুলির মতো, যখন foo বলা হয়, সংখ্যা x foo তার যুক্তি x হিসাবে কপি করা হয়।

অন্যদিকে, বস্তুর সাথে আচরণ করার সময় জাভাস্ক্রিপ্ট সবসময় রেফারেন্স ব্যবহার করে। যদি বলা হয়, আপনি একটি বস্তুর সাথে foo ডেকেছেন, এটির বন্ধ হওয়াটি মূল বস্তুর উল্লেখ করবে!

function foo(x) {
  var tmp = 3;

  return function (y) {
    console.log(x + y + tmp);
    x.memb = x.memb ? x.memb + 1 : 1;
    console.log(x.memb);
  }
}

var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);

প্রত্যাশিত হিসাবে, bar(10) প্রতিটি কল bar(10) x.memb বৃদ্ধি হবে। কি প্রত্যাশিত হতে পারে না, যে x কেবল ঐক্য হিসাবে একই বস্তুর উল্লেখ করা হয়! bar কল করলে ২ বছর age.memb হবে! এই রেফারেন্সিং এইচটিএমএল বস্তুর সাথে মেমরি লিক্স জন্য ভিত্তি।

Question

আপনি কীভাবে ধারণার ধারণাগুলির সাথে জাভাস্ক্রিপ্ট বন্ধের ব্যাখ্যা করবেন (উদাহরণস্বরূপ ফাংশন, ভেরিয়েবল এবং এর মত), তবে নিজের বন্ধন বুঝতে পারে না?

উইকিপিডিয়াতে দেওয়া স্কিম উদাহরণটি আমি দেখেছি, কিন্তু দুর্ভাগ্যবশত এটি সাহায্য করে নি।




আমি একটি ব্লগে পোস্ট বন্ধ ব্যাখ্যা কিছুক্ষণ আগে। আপনি চাইলে কেন বন্ধ থাকার বিষয়ে আমি এখানে বললাম ।

ক্লোজারগুলি একটি ফাংশনকে স্থায়ী, ব্যক্তিগত ভেরিয়েবলগুলির জন্য কার্যকর করার একটি উপায় - অর্থাৎ, কেবলমাত্র একটি ফাংশন যা জানে তার ভেরিয়েবলগুলি, যেখানে এটি চালানো হয়েছে এমন পূর্ববর্তী বার থেকে তথ্য ট্র্যাক রাখতে পারে।

যে অর্থে, তারা একটি ফাংশন ব্যক্তিগত বৈশিষ্ট্য সঙ্গে একটি বস্তুর মত একটি বিট কাজ করা যাক।

সম্পূর্ণ পোস্ট:

তাই এই বন্ধ জিনিস জিনিস কি?




একটি অন্তর্বর্তী ফাংশন যেখানে তার বাইরের ফাংশন ভেরিয়েবল অ্যাক্সেস আছে। এটি সম্ভবত সহজতম এক-লাইনের ব্যাখ্যা যা আপনি বন্ধ করার জন্য পেতে পারেন।




আমি এখানে উত্তর এত জটিল কেন বুঝতে পারছি না।

এখানে একটি বন্ধ আছে:

var a = 42;

function b() { return a; }

হ্যাঁ। আপনি সম্ভবত একটি দিন যে অনেক বার ব্যবহার করুন।


ক্লোজার নির্দিষ্ট সমস্যা মোকাবেলার একটি জটিল নকশা হ্যাক বিশ্বাস করার কোন কারণ নেই। না, ক্লোজারগুলি এমন একটি পরিবর্তনশীল ব্যবহার করে যা ফাংশন ঘোষিত হয় (চালানো হয় না) এর দৃষ্টিকোণ থেকে উচ্চতর সুযোগ থেকে আসে ।

এখন কি এটা করতে পারবেন আপনি, আরো দর্শনীয় হতে পারে না বলে অন্যের উত্তর দেখুন।




আমি ভাল / খারাপ তুলনা দ্বারা ভাল শিখতে ঝোঁক। আমি কর্মক্ষেত্রের কোডটি অনুসরণ করতে চাই যা অননুমোদিত কোডটি অনুসরণ করে যা কেউ সম্মুখীন হতে পারে। আমি একটি JsFiddle একসঙ্গে রাখে যা তুলনা করে এবং সহজতর ব্যাখ্যাগুলির সাথে পার্থক্যগুলিকে উড়িয়ে দেওয়ার চেষ্টা করে।

বন্ধ অধিকার অধিকার:

console.log('CLOSURES DONE RIGHT');

var arr = [];

function createClosure(n) {
    return function () {
        return 'n = ' + n;
    }
}

for (var index = 0; index < 10; index++) {
    arr[index] = createClosure(index);
}

for (var index in arr) {
    console.log(arr[index]());
}
  • উপরের কোড createClosure(n)লুপ প্রতি পুনরাবৃত্তি মধ্যে আহ্বান করা হয়। মনে রাখবেন যে, আমি পরিবর্তনশীল নামে nহাইলাইট করতে এটি একটি যে নতুন একটি নতুন ফাংশন সুযোগ সৃষ্টি পরিবর্তনশীল এবং একই পরিবর্তনশীল হিসাবে নয় indexযা বাইরের সুযোগ আবদ্ধ হয়।

  • এটি একটি নতুন সুযোগ তৈরি করে এবং nসেই সুযোগের সাথে আবদ্ধ হয়; এর মানে আমাদের 10 টি পৃথক স্কোপ রয়েছে, প্রতিটি পুনরাবৃত্তির জন্য একটি।

  • createClosure(n) যে সুযোগ মধ্যে এন ফিরে যে একটি ফাংশন ফেরত।

  • প্রতিটি সুযোগের মধ্যে nযখন createClosure(n)এটি আহ্বান করা হয়েছিল তখন যা মূল্য ছিল তার সাথে আবদ্ধ ছিল তাই যে নেস্টেড ফাংশনটি ফেরত পাওয়া যায় সেটি সর্বদা nযেটি যখন বলা createClosure(n)হয়েছিল তার মানটি ফেরত দেবে ।

বন্ধন ভুল হয়েছে:

console.log('CLOSURES DONE WRONG');

function createClosureArray() {
    var badArr = [];

    for (var index = 0; index < 10; index++) {
        badArr[index] = function () {
            return 'n = ' + index;
        };
    }
    return badArr;
}

var badArr = createClosureArray();

for (var index in badArr) {
    console.log(badArr[index]());
}
  • উপরের কোডে লুপটি createClosureArray()ফাংশনের মধ্যে সরানো হয়েছে এবং ফাংশনটি এখন সম্পন্ন হওয়া অ্যারেটি ফেরত দেয়, যা প্রথম নজরে আরো স্বজ্ঞাত মনে হয়।

  • কোনটি সুস্পষ্ট নাও হতে পারে যেহেতু createClosureArray()লুপের প্রতিটি পুনরাবৃত্তির জন্য একের পরিবর্তে এই ফাংশনের জন্য শুধুমাত্র একটি সুযোগ তৈরি করা হয়।

  • এই ফাংশনের মধ্যে একটি পরিবর্তনশীল নাম indexসংজ্ঞায়িত করা হয়। লুপ রান এবং অ্যারে ফাংশন যোগ করে যে index। নোট যে ফাংশন indexমধ্যে সংজ্ঞায়িত করা হয় createClosureArrayযা শুধুমাত্র একবার একবার আহ্বান পায়।

  • কারন createClosureArray()ফাংশনের মধ্যে শুধুমাত্র একটি সুযোগ ছিল, শুধুমাত্র সেই সুযোগের মধ্যে indexএকটি মানের সাথে আবদ্ধ। অন্য কথায়, প্রতিটি সময় লুপ মান পরিবর্তন করে index, এটি যে সুযোগের মধ্যে এটি উল্লেখ করে এমন সবকিছুর জন্য এটি পরিবর্তন করে।

  • অ্যারে যোগ করা সমস্ত ফাংশন indexমূল প্যারামিটার থেকে একই পরিবর্তনশীলটি ফেরত দেয় যেখানে এটি 10 ​​টি ভিন্ন পরিবর্তে 10 টি পৃথক স্কোপের উদাহরণ হিসাবে প্রথম সংজ্ঞায়িত করে। শেষ ফলাফল হল সমস্ত 10 ফাংশন একই সুযোগ থেকে একই পরিবর্তনশীল ফিরে।

  • লুপ শেষ হওয়ার পরে এবং indexশেষ মান পরিবর্তন করা হয় 10 হয়, তাই অ্যারে যোগ করা প্রতিটি ফাংশন একক indexপরিবর্তনশীলের মান প্রদান করে যা এখন 10 সেট করে।

ফল

CLOSURES DONE RIGHT
N = 0
এন = 1
এন = 2
এন = 3
এন = 4
এন = 5
এন = 6
এন = 7
এন = 8
এন = 9

CLOSURES DONE WRONG
N = 10
এন = 10
এন = 10
এন = 10
এন = 10
এন = 10
এন = 10
এন = 10
এন = 10
এন = 10




কিভাবে আমি কাজ বন্ধ কিভাবে ব্যাখ্যা একটি ইন্টারেক্টিভ জাভাস্ক্রিপ্ট টিউটোরিয়াল রাখা। একটি বন্ধ কি?

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

var create = function (x) {
    var f = function () {
        return x; // We can refer to x here!
    };
    return f;
};
// 'create' takes one argument, creates a function

var g = create(42);
// g is a function that takes no arguments now

var y = g();
// y is 42 here



Closures ব্যাখ্যা করা কঠিন কারণ তারা কিছু আচরণ কাজ করার জন্য ব্যবহার করা হয় যে সবাই intuitively যাই হোক না কেন কাজ করার আশা। আমি তাদের ব্যাখ্যা করার সর্বোত্তম উপায় খুঁজে পেয়েছি (এবং যেভাবে তারা যা শিখেছে তা আমি শিখেছি) তাদের ছাড়া পরিস্থিতি কল্পনা করা:

    var bind = function(x) {
        return function(y) { return x + y; };
    }
    
    var plus5 = bind(5);
    console.log(plus5(3));

জাভাস্ক্রিপ্ট বন্ধ না জানলে কি হবে? শুধু তার পদ্ধতির শরীরের দ্বারা শেষ লাইনে কলটিকে প্রতিস্থাপন করুন (যা মূলত ফাংশন কল করে) এবং আপনি পান:

console.log(x + 3);

এখন, x এর সংজ্ঞা কোথায়? আমরা বর্তমান সুযোগ এটি সংজ্ঞায়িত না।একমাত্র সমাধান তার সুযোগ (অথবা বরং, তার পিতামাতার সুযোগ) plus5 বহন করা হয়। এই ভাবে, xভাল সংজ্ঞায়িত করা হয় এবং এটি মান 5 থেকে আবদ্ধ।




প্রশ্নটি গুরুত্ব সহকারে গ্রহণ করা উচিত, আমরা 6-বছর-বয়সী একজন জ্ঞানীয়ভাবে সক্ষম কি তা খুঁজে বের করতে পারি, যদিও স্বীকার্যক্রমে, জাভাস্ক্রিপ্টে আগ্রহী এমন ব্যক্তিটি এত আদর্শ নয়।

শৈশব উন্নয়ন: 5 থেকে 7 বছর এটি বলে:

আপনার সন্তান দুই ধাপে নির্দেশ অনুসরণ করতে সক্ষম হবে। উদাহরণস্বরূপ, আপনি যদি আপনার সন্তানের কাছে বলেন, "রান্নাঘরে যান এবং আমাকে একটি ট্র্যাশ ব্যাগ দিন" তারা সেই দিকটি মনে রাখতে পারবে।

আমরা এই উদাহরণটি বন্ধ করার ব্যাখ্যা হিসাবে ব্যবহার করতে পারি:

রান্নাঘরটি একটি ক্লোজার যা একটি স্থানীয় পরিবর্তনশীল, trashBags নামে trashBagsgetTrashBag নামক রান্নাঘরে একটি ফাংশন রয়েছে যা একটি ট্র্যাশ ব্যাগ পায় এবং এটি ফেরত দেয়।

আমরা এই মত জাভাস্ক্রিপ্ট এই কোড করতে পারেন:

function makeKitchen () {
  var trashBags = ['A', 'B', 'C']; // only 3 at first

  return {
    getTrashBag: function() {
      return trashBags.pop();
    }
  };
}

var kitchen = makeKitchen();

kitchen.getTrashBag(); // returns trash bag C
kitchen.getTrashBag(); // returns trash bag B
kitchen.getTrashBag(); // returns trash bag A

বন্ধ পয়েন্ট আকর্ষণীয় কারণ ব্যাখ্যা আরও পয়েন্ট:

  • প্রত্যেক সময় তৈরি makeKitchen() বলা হয়, একটি নতুন বন্ধন নিজস্ব আলাদা trashBags দিয়ে তৈরি করা হয়।
  • trashBags ভেরিয়েবল প্রতিটি রান্নাঘরের অভ্যন্তরে স্থানীয় এবং এটি বাইরে অ্যাক্সেসযোগ্য নয়, তবে getTrashBag সম্পত্তিটির অভ্যন্তরীণ ফাংশনটি অ্যাক্সেস আছে।
  • প্রতিটি ফাংশন কল বন্ধ করার সৃষ্টি করে, তবে বন্ধ থাকা ভেতরে অ্যাক্সেস আছে এমন কোনও অভ্যন্তরীণ ফাংশন, বন্ধ করার বাইরে থেকে বলা যেতে পারে না যতক্ষন না এটি প্রায় বন্ধ রাখার দরকার নেই। getTrashBag ফাংশন দিয়ে বস্তুটি ফেরত এখানে যে।



আপনি উপর একটি ঘুম হচ্ছে এবং আপনি দান আমন্ত্রণ। ড্যানকে এক এক্সবক্স কন্ট্রোলার আনতে বলুন।

ড্যান ড। ড্যান ড। দলের কতগুলো কন্ট্রোলার আনা হয়েছিল?

function sleepOver(howManyControllersToBring) {

    var numberOfDansControllers = howManyControllersToBring;

    return function danInvitedPaul(numberOfPaulsControllers) {
        var totalControllers = numberOfDansControllers + numberOfPaulsControllers;
        return totalControllers;
    }
}

var howManyControllersToBring = 1;

var inviteDan = sleepOver(howManyControllersToBring);

// The only reason Paul was invited is because Dan was invited. 
// So we set Paul's invitation = Dan's invitation.

var danInvitedPaul = inviteDan(howManyControllersToBring);

alert("There were " + danInvitedPaul + " controllers brought to the party.");



ঠিক আছে, 6 বছর বয়সী বন্ধন ফ্যান। আপনি বন্ধ করার সহজ উদাহরণ শুনতে চান?

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

এখানে আমি কিভাবে আমার সমতল গল্প কোড কোড রূপান্তর করতে পারেন।

var plane = function (defaultAirport) {

    var lastAirportLeft = defaultAirport;

    var car = {
        driver: {
            startAccessPlaneInfo: function () {
                setInterval(function () {
                    console.log("Last airport was " + lastAirportLeft);
                }, 2000);
            }
        }
    };
    car.driver.startAccessPlaneInfo();

    return {
        leaveTheAirport: function (airPortName) {
            lastAirportLeft = airPortName;
        }
    }
}("Boryspil International Airport");

plane.leaveTheAirport("John F. Kennedy");




লেখক Closures চমত্কার বন্ধ ব্যাখ্যা করেছেন কেন আমরা তাদের প্রয়োজন ব্যাখ্যা এবং LexicalEnvironment যা বন্ধ বুঝতে প্রয়োজনীয় ব্যাখ্যা।
এখানে সারাংশ আছে:

যদি একটি পরিবর্তনশীল অ্যাক্সেস করা হয়, কিন্তু এটি স্থানীয় নয়? এখানকার মত:

এই ক্ষেত্রে, দোভাষী বাইরের LexicalEnvironmentবস্তুর পরিবর্তনশীল খুঁজে বের করে ।

প্রক্রিয়া দুটি ধাপ রয়েছে:

  1. প্রথম, যখন একটি ফাংশন F তৈরি হয়, এটি খালি জায়গায় তৈরি হয় না। একটি বর্তমান LexicalEnvironment বস্তু আছে। উপরের ক্ষেত্রে, এটি উইন্ডো (একটি ফাংশন তৈরির সময় অনির্ধারিত)।

যখন একটি ফাংশন তৈরি হয়, তখন এটি একটি লুকানো সম্পত্তি পায়, [[স্কোপ]], যা বর্তমান লেক্সিক্যাল এনভায়রনমেন্টকে উল্লেখ করে।

একটি পরিবর্তনশীল পড়া হয়, কিন্তু কোথাও পাওয়া যাবে না, একটি ত্রুটি উত্পন্ন হয়।

নেস্টেড ফাংশন

ফাংশনকে অন্যের ভিতর একটিকে নিস্তেজ করা যেতে পারে, লেক্সিক্যাল এনভায়রনমেন্টগুলির একটি চেইন গঠন করা যেতে পারে যা একটি সুযোগ চেইন বলা যেতে পারে।

সুতরাং, ফাংশন জি, অ্যাক্সেস জি এবং একটি।

বন্ধ

বাহ্যিক ফাংশন সমাপ্ত হওয়ার পরে একটি নেস্টেড ফাংশন লাইভ থাকতে পারে:

লেক্সিকাল এনভায়রনমেন্টগুলি চিহ্নিত করা হচ্ছে:

যেমনটি আমরা দেখি, this.sayব্যবহারকারীর বস্তুর একটি সম্পত্তি, তাই এটি ব্যবহারকারীর সম্পন্ন হওয়ার পরেই চলতে থাকে।

এবং যদি আপনি মনে করেন, কখন this.sayতৈরি হয়, এটি (প্রতিটি ফাংশন হিসাবে) this.say.[[Scope]]বর্তমান লেক্সিক্যাল এনভায়রনমেন্টের অভ্যন্তরীণ রেফারেন্স পায় । সুতরাং, বর্তমান ব্যবহারকারীর সঞ্চালনের লেক্সিক্যাল এনভায়রনমেন্ট মেমরিতে থাকে। ব্যবহারকারীর সমস্ত ভেরিয়েবল তার বৈশিষ্ট্যও রয়েছে, তাই তারাও সাবধানে রাখা হয়, সাধারণত সাধারণত জাঙ্ক করা হয় না।

পুরো বিন্দুটি নিশ্চিত করা যে অভ্যন্তরীণ ফাংশনটি ভবিষ্যতে একটি বাহ্যিক পরিবর্তনশীল অ্যাক্সেস করতে চায় তবে এটি তা করতে সক্ষম।

সংক্ষেপ:

  1. ভিতরের ফাংশন বাইরের লেক্সিক্যাল এনভায়রনমেন্টের একটি রেফারেন্স রাখে।
  2. অভ্যন্তরীণ ফাংশন বাইরের ফাংশন শেষ হয়ে গেলেও যেকোন সময় থেকে তার থেকে ভেরিয়েবল অ্যাক্সেস করতে পারে।
  3. ব্রাউজারটি লেক্সিক্যাল এনভায়রনমেন্ট এবং তার সমস্ত বৈশিষ্ট্য (ভেরিয়েবল )কে মেমরিতে রাখে যতক্ষন না একটি অভ্যন্তরীণ ফাংশন এটি উল্লেখ করে।

এই একটি বন্ধ বলা হয়।




আমি কিভাবে ছয় বছর বয়সী এটা ব্যাখ্যা করতে হবে:

আপনি জানেন কিভাবে বড় বড় বাড়ি মালিকের মালিক হতে পারে এবং তারা এটিকে বাড়ি বলে ডাকে? যখন একটি মায়ের বাচ্চা থাকে, তখন বাচ্চাটির কোন কিছুই ঠিক থাকে না, তাই না? কিন্তু তার বাবা-মায়ের একটি বাড়ি আছে, তাই যখনই কেউ আপনার সন্তানকে জিজ্ঞেস করে "আপনার বাড়ি কোথায়?", সে "সেই বাড়ির" উত্তর দিতে পারে এবং তার পিতামাতার বাড়িতে নির্দেশ করে। একটি "ক্লোজার" বাচ্চাটির ক্ষমতা সবসময় (এমনকি যদি বিদেশে থাকে) বলার ক্ষমতা থাকে যে এটি একটি বাড়ি আছে, যদিও এটি প্রকৃতপক্ষে পিতামাতার বাড়ির মালিক।




আচ্ছা, 6 বছর বয়সী সন্তানের সাথে কথা বলার জন্য, আমি সম্ভবত নিম্নলিখিত সংস্থার ব্যবহার করব।

কল্পনা করুন - আপনি পুরো বাড়িতে আপনার ছোট ভাই ও বোনদের সাথে খেলছেন, এবং আপনি আপনার খেলনা নিয়ে ঘুরে বেড়াচ্ছেন এবং তাদের কয়েকজনকে আপনার বড় ভাইয়ের ঘরে নিয়ে এসেছেন। কিছুদিন পরেই তোমার ভাই স্কুলে ফিরে এল এবং তার ঘরে ঢুকল, আর সে ভিতরে প্রবেশ করলো, তাই এখন তুমি সরাসরি সরাসরি সেখানে থাকা খেলনাগুলো অ্যাক্সেস করতে পারনি। কিন্তু আপনি দরজা খোঁচা এবং খেলনা জন্য আপনার ভাইয়ের জিজ্ঞাসা করতে পারে। এই খেলনা বন্ধ করা হয় ; আপনার ভাই এটা আপনার জন্য তৈরি, এবং তিনি বাইরের সুযোগ এখন হয় ।

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

একটি উন্নত সন্তানের জন্য আমি নিম্নলিখিত মত কিছু করা হবে। এটি নিখুঁত নয়, তবে এটি আপনাকে কী করে তা মনে করে:

function playingInBrothersRoom (withToys) {
  // We closure toys which we played in the brother's room. When he come back and lock the door
  // your brother is supposed to be into the outer [[scope]] object now. Thanks god you could communicate with him.
  var closureToys = withToys || [],
      returnToy, countIt, toy; // Just another closure helpers, for brother's inner use.

  var brotherGivesToyBack = function (toy) {
    // New request. There is not yet closureToys on brother's hand yet. Give him a time.
    returnToy = null;
    if (toy && closureToys.length > 0) { // If we ask for a specific toy, the brother is going to search for it.

      for ( countIt = closureToys.length; countIt; countIt--) {
        if (closureToys[countIt - 1] == toy) {
          returnToy = 'Take your ' + closureToys.splice(countIt - 1, 1) + ', little boy!';
          break;
        }
      }
      returnToy = returnToy || 'Hey, I could not find any ' + toy + ' here. Look for it in another room.';
    }
    else if (closureToys.length > 0) { // Otherwise, just give back everything he has in the room.
      returnToy = 'Behold! ' + closureToys.join(', ') + '.';
      closureToys = [];
    }
    else {
      returnToy = 'Hey, lil shrimp, I gave you everything!';
    }
    console.log(returnToy);
  }
  return brotherGivesToyBack;
}
// You are playing in the house, including the brother's room.
var toys = ['teddybear', 'car', 'jumpingrope'],
    askBrotherForClosuredToy = playingInBrothersRoom(toys);

// The door is locked, and the brother came from the school. You could not cheat and take it out directly.
console.log(askBrotherForClosuredToy.closureToys); // Undefined

// But you could ask your brother politely, to give it back.
askBrotherForClosuredToy('teddybear'); // Hooray, here it is, teddybear
askBrotherForClosuredToy('ball'); // The brother would not be able to find it.
askBrotherForClosuredToy(); // The brother gives you all the rest
askBrotherForClosuredToy(); // Nothing left in there

আপনি দেখতে পারেন যে, ঘরে থাকা খেলনাগুলি এখনও ভাইয়ের মাধ্যমে অ্যাক্সেসযোগ্য এবং রুম লক থাকলেও কোন ব্যাপার না। এখানে এটি সঙ্গে প্রায় খেলা একটি jsbin হয়।




জাভাস্ক্রিপ্টে একটি ফাংশন নির্দেশাবলীর একটি সেটের একটি রেফারেন্স নয় (যেমন সি ভাষায়), কিন্তু এটি একটি লুকানো তথ্য কাঠামোও অন্তর্ভুক্ত করে যা এটি ব্যবহার করা সমস্ত ননলোকাল ভেরিয়েবলের রেফারেন্সগুলি তৈরি করে (ক্যাপচার ভেরিয়েবল)। যেমন দুই টুকরা ফাংশন বন্ধ বলা হয়। জাভাস্ক্রিপ্ট প্রতিটি ফাংশন একটি বন্ধ হিসাবে বিবেচনা করা যেতে পারে।

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

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

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

একটি উদাহরণ:

function foo (initValue) {
   //This variable is not destroyed when the foo function exits.
   //It is 'captured' by the two nested functions returned below.
   var value = initValue;

   //Note that the two returned functions are created right now.
   //If the foo function is called again, it will return
   //new functions referencing a different 'value' variable.
   return {
       getValue: function () { return value; },
       setValue: function (newValue) { value = newValue; }
   }
}

function bar () {
    //foo sets its local variable 'value' to 5 and returns an object with
    //two functions still referencing that local variable
    var obj = foo(5);

    //Extracting functions just to show that no 'this' is involved here
    var getValue = obj.getValue;
    var setValue = obj.setValue;

    alert(getValue()); //Displays 5
    setValue(10);
    alert(getValue()); //Displays 10

    //At this point getValue and setValue functions are destroyed
    //(in reality they are destroyed at the next iteration of the garbage collector).
    //The local variable 'value' in the foo is no longer referenced by
    //anything and is destroyed too.
}

bar();



আমি কেবল তাদের মোজিলা ক্লোজার পৃষ্ঠাতে নির্দেশ করব । এটা সবচেয়ে ভাল, সবচেয়ে সংক্ষিপ্ত এবং আমি বন্ধ পেয়েছি যে বাস্তব বুনিয়াদি এবং সহজ ব্যবহার ব্যাখ্যা । এটা অত্যন্ত জাভাস্ক্রিপ্ট শেখার কেউ সুপারিশ করা হয়।

এবং হ্যাঁ, আমি এমনকি এটি 6 বছরের বৃদ্ধকে সুপারিশ করব - 6 বছর বয়সী যদি বন্ধের বিষয়ে শিখতে পারে তবে এটি যৌক্তিক এবং নিবন্ধে দেওয়া সংক্ষিপ্ত এবং সহজ ব্যাখ্যাটি বোঝার জন্য প্রস্তুত ।




Related