সি # এর ল্যাম্বডা এক্সপ্রেশনটির ক্লোজারও রয়েছে তবে সি # সম্প্রদায় বা বইয়ের দ্বারা খুব কমই আলোচনা হয়। আমি জাভাস্ক্রিপ্টের অনেক লোক এবং বইগুলি সি # বিশ্বে এর চেয়ে বেশি বন্ধ হওয়ার কথা বলছি। কেন এমন?
সি # এর ল্যাম্বডা এক্সপ্রেশনটির ক্লোজারও রয়েছে তবে সি # সম্প্রদায় বা বইয়ের দ্বারা খুব কমই আলোচনা হয়। আমি জাভাস্ক্রিপ্টের অনেক লোক এবং বইগুলি সি # বিশ্বে এর চেয়ে বেশি বন্ধ হওয়ার কথা বলছি। কেন এমন?
উত্তর:
কারণ জাভাস্ক্রিপ্টে নেমস্পেসের মতো বৈশিষ্ট্য নেই এবং আপনি সমস্ত ধরণের বিশ্বব্যাপী অবজেক্টের সাথে খুব সহজেই গণ্ডগোল করতে পারেন।
সুতরাং এটির নিজের কার্যকর পরিবেশে কিছু কোড আলাদা করতে সক্ষম হওয়া জরুরী। বন্ধ এটি জন্য নিখুঁত।
ক্লোজারের এই ব্যবহারটি সি # এর মতো ভাষায় বোঝায় না যেখানে আপনার নামের স্থান, ক্লাস ইত্যাদি রয়েছে কোডকে পৃথক করে দেওয়া এবং সমস্ত কিছুকে বিশ্বব্যাপী সুযোগে না রেখে।
জাভাস্ক্রিপ্ট কোডের জন্য একটি খুব সাধারণ অনুশীলন এটি এ জাতীয় লিখন করছে:
(function(){
// Some code
})();
আপনি দেখতে পাচ্ছেন, এটি একটি বেনামে ফাংশন ঘোষণা, এর সাথে সাথে এর সম্পাদন। সুতরাং, ফাংশনটির মধ্যে সংজ্ঞায়িত সমস্ত কিছুই বাইরে থেকে অ্যাক্সেস করা অসম্ভব এবং আপনি বৈশ্বিক সুযোগকে বিশৃঙ্খলা করবেন না। এই ফাংশনটির কার্যকরকরণ প্রসঙ্গে যতক্ষণ না কিছু কোড ব্যবহার করে ততক্ষণ জীবিত থাকবে, এই প্রসঙ্গে বর্ণিত নেস্টেড ফাংশনগুলির মতো, আপনি কলব্যাক বা যা কিছু পাস করতে পারবেন।
জাভাস্ক্রিপ্ট সি # এর চেয়ে খুব আলাদা ভাষা। এটি উদ্দেশ্য ভিত্তিক নয়, এটি প্রোটোটাইপমুখী। এটি শেষে খুব আলাদা অনুশীলনের দিকে পরিচালিত করে।
যাইহোক, ক্লোজারগুলি ভাল, তাই এগুলি ব্যবহার করুন, এমনকি সি # তেও!
সম্পাদনা: স্ট্যাকওভারফ্লো এর আড্ডায় কিছু আলোচনা করার পরে, আমি মনে করি এই অ্যানোভারটি নির্ভুল করা উচিত।
নমুনা কোডের কার্যকারিতাটি কোনও বন্ধ নয়। তবে এই ফুকশন স্থানীয় ভেরিয়েবল এবং নেস্টেড ফাংশনগুলি সংজ্ঞায়িত করতে পারে। এই স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে এমন সমস্ত নেস্টেড ফাংশন হ'ল ক্লোজার।
এটি বিশ্বব্যাপী সুযোগ ফাঁসানো ছাড়াই ফাংশনগুলির একটি সেট জুড়ে কিছু ডেটা ভাগ করে নেওয়া উপকারী। এটি জাভাস্ক্রিপ্টে বন্ধের সর্বাধিক সাধারণ ব্যবহার।
ক্লোজারটি এই জাতীয় কিছু ডেটা ভাগ করার চেয়ে আরও শক্তিশালী, তবে আসুন বাস্তববাদী হয়ে উঠুন, বেশিরভাগ প্রোগ্রামার ফাংশনাল প্রোগ্রামিং সম্পর্কে কোনও জিনিস জানেন না। সি # তে আপনি এই ধরণের ব্যবহারের জন্য শ্রেণি বা একটি নেমস্পেস ব্যবহার করতেন, তবে জেএস এই কার্যকারিতা সরবরাহ করে না।
আপনি বিশ্বব্যাপী সুযোগকে রক্ষা করার চেয়ে ক্লোজারের সাথে আরও কিছু করতে পারেন তবে আপনি জেএস উত্স কোডে এটি দেখতে পাবেন।
সম্ভবত কারণ জাভাস্ক্রিপ্টের অবজেক্ট ওরিয়েন্টেশনের জনপ্রিয় প্রয়োগগুলি ক্লোজারের উপর নির্ভর করে। আসুন একটি সহজ উদাহরণ তাকান:
function counter() {
var value = 0;
this.getValue = function() { return value; }
this.increase = function() { value++; }
}
var myCounter = new counter();
console.log(myCounter.getValue());
myCounter.increase();
console.log(myCounter.getValue());
পদ্ধতিগুলি getValue
এবং increase
প্রকৃতপক্ষে সমাপ্তি, ভেরিয়েবলকে encapsulating value
।
কারণ জাভাস্ক্রিপ্টকে 'বহনযোগ্য' করে তোলে এমন অনেক লাইব্রেরি সেগুলি ব্যবহার করে।
কটাক্ষপাত JQuery , প্রোটোটাইপ বা MooTools শুধু তিনটি জনপ্রিয় নাম। এই লাইব্রেরির প্রত্যেকটি each
তাদের সংগ্রহের পুনরাবৃত্তির পছন্দসই উপায় হিসাবে একটি পদ্ধতি সরবরাহ করে যা একটি পুনরাবৃত্তকারী ফাংশন ব্যবহার করে। বাহ্যিক স্কোপগুলিতে মানগুলি অ্যাক্সেস করার সময়, এই ফাংশনটি বন্ধ হয়ে যাবে:
[1,2,3].each(function(item) {
console.log(item);
});
এবং এটি এখানে থেমে নেই: অ্যাজাক্সের কলব্যাকস, এক্সট্রাজেজে ইভেন্ট হ্যান্ডলিং ইত্যাদি সমস্ত ফাংশন গ্রহণ করে এবং আপনি যদি আপনার কোডটি 100 বারের ফাংশনগুলির সাথে কল করতে চান যা ঠিক একবার বলা হয়, বন্ধ হয়ে যাওয়ার উপায়।
console.log
বাহ্যিক স্কোপে নির্দিষ্ট করা হয়, তেমনি console
একটি 'ফ্রি ভেরিয়েবল'। এবং, বাস্তবে, কেন একটি লুপ, যা কিছু আলাদা করে না, একটি খারাপ অভ্যাস?
আমি অন্যান্য উত্তরের সাথে একমত যে জাভাস্ক্রিপ্টের সাথে "ভাল" কোডিং আরও বেশি ক্লোজারের উপর নির্ভরশীল। যাইহোক, এটি ছাড়াও, এটি সম্ভবত প্রতিটি ভাষাতে বৈশিষ্ট্যটি কত দিন ধরে রয়েছে তা কেবল একটি প্রশ্ন। জাভাস্ক্রিপ্টটির প্রাথমিকভাবে বাস্তবায়নকালের পরে বন্ধ রয়েছে। অন্যদিকে সি # এ কেবল তাদের 3.0 রয়েছে, যা ভিজ্যুয়াল স্টুডিও ২০০৮ দিয়ে প্রকাশ হয়েছিল।
আমি চালিত প্রচুর সি # প্রোগ্রামার এখনও 2.0 প্রকল্পে কাজ করছেন। এমনকি যদি তারা 3.0 বা 4.0 এ কাজ করে তবে তারা প্রায়শই 2.0 আইডিয়াম ব্যবহার করে। আমি ক্লোজার পছন্দ করি; আশা করা যায় যে তারা সি # তে আরও বেশি ব্যবহৃত হবে কারণ ধারণাটি সি # বিকাশকারীদের মধ্যে প্রচার করে।
এর মূল কারণ হ'ল সি # স্থিতিশীলভাবে টাইপ করা হয়েছে এবং ফাংশনগুলিতে কেবলমাত্র একটি একক, পূর্বনির্ধারিত পরিবেশে অ্যাক্সেস রয়েছে যা বন্ধ হওয়ার উপযোগিতা বাধা দেয়।
অন্যদিকে জাভাস্ক্রিপ্টে, ক্লোজারগুলি যখন কোনও বস্তুর সম্পত্তি হিসাবে অ্যাক্সেস করা হয় এবং প্রথম শ্রেণীর অবজেক্ট হয় সেগুলি পদ্ধতি হিসাবে আচরণ করতে সক্ষম করে, তাদের বিভিন্ন পরিবেশেও ইনজেকশনের ব্যবস্থা করা যেতে পারে যা সাব্রোটাইনগুলিকে বিভিন্ন প্রসঙ্গে কাজ করতে দেয়।
তাদের সম্পর্কে আমার জানার একটি কারণ ছিল কারণ আপনি যখন ডিওএম উপাদানগুলির (বা সত্যিকারের কোনও কিছু) লুপ করছেন, আপনি পরিবর্তনশীল সুযোগটি "বন্ধ" বা "এনক্যাপসুলেট" করতে সক্ষম হতে চান। যেমন এখানে পোস্ট উদাহরণ হিসাবে: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable- for-later-execution