জাভাস্ক্রিপ্টের জন্য ক্লোজার কেন গুরুত্বপূর্ণ?


16

সি # এর ল্যাম্বডা এক্সপ্রেশনটির ক্লোজারও রয়েছে তবে সি # সম্প্রদায় বা বইয়ের দ্বারা খুব কমই আলোচনা হয়। আমি জাভাস্ক্রিপ্টের অনেক লোক এবং বইগুলি সি # বিশ্বে এর চেয়ে বেশি বন্ধ হওয়ার কথা বলছি। কেন এমন?


3
কারণ জাভাস্ক্রিপ্টটিকে প্রথম শ্রেণির কার্যকরী ভাষা হিসাবে বিবেচনা করা হয় এবং সি # একটি ধ্রুপদী ওওপি ল্যাঙ্গেজ। বিভিন্ন দৃষ্টান্ত, বিভিন্ন প্রোগ্রামিং শৈলী।
রায়নস

1
প্রথম শ্রেণির ফাংশন থাকা ভাষাটিকে একটি কার্যকরী ভাষা করে তোলে। পিএইচপি (5.3 থেকে), পাইথন বা ডি এর প্রথম শ্রেণির ফাংশন রয়েছে। আপনি কি বলবেন যে এগুলি কার্যকরী ভাষা? অবশ্যই না এবং জাভাস্ক্রিপ্ট হয়।
ডেডালনিক্স

1
@ ডেডালনিক্স জাভাস্ক্রিপ্ট একটি বহুমাত্রিক ভাষা। এটি মূলত পদ্ধতিগত, কার্যকরী এবং প্রোটোটাইপিকাল ওও দৃষ্টান্ত সমর্থন করে। এটি কোনওভাবেই খাঁটি কার্যকরী ভাষা নয়, তবে ভাষাটি বাঁকানো ছাড়াই আপনি কার্যকরী দৃষ্টিতে সহজেই জাভাস্ক্রিপ্ট লিখতে পারেন। আমি সি # এবং অজগর একই বলব।
রায়নস

3
@ ডেডালনিক্স, এমন একটি ভাষা যা আপনাকে ওয়াই-কম্বিনেটর সংজ্ঞায়িত করতে দেয় এটি একটি কার্যকরী ভাষা। সংজ্ঞানুসারে.
এস কে-যুক্তি

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

উত্তর:


5

কারণ জাভাস্ক্রিপ্টে নেমস্পেসের মতো বৈশিষ্ট্য নেই এবং আপনি সমস্ত ধরণের বিশ্বব্যাপী অবজেক্টের সাথে খুব সহজেই গণ্ডগোল করতে পারেন।

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

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

জাভাস্ক্রিপ্ট কোডের জন্য একটি খুব সাধারণ অনুশীলন এটি এ জাতীয় লিখন করছে:

(function(){
    // Some code
})();

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

জাভাস্ক্রিপ্ট সি # এর চেয়ে খুব আলাদা ভাষা। এটি উদ্দেশ্য ভিত্তিক নয়, এটি প্রোটোটাইপমুখী। এটি শেষে খুব আলাদা অনুশীলনের দিকে পরিচালিত করে।

যাইহোক, ক্লোজারগুলি ভাল, তাই এগুলি ব্যবহার করুন, এমনকি সি # তেও!

সম্পাদনা: স্ট্যাকওভারফ্লো এর আড্ডায় কিছু আলোচনা করার পরে, আমি মনে করি এই অ্যানোভারটি নির্ভুল করা উচিত।

নমুনা কোডের কার্যকারিতাটি কোনও বন্ধ নয়। তবে এই ফুকশন স্থানীয় ভেরিয়েবল এবং নেস্টেড ফাংশনগুলি সংজ্ঞায়িত করতে পারে। এই স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে এমন সমস্ত নেস্টেড ফাংশন হ'ল ক্লোজার।

এটি বিশ্বব্যাপী সুযোগ ফাঁসানো ছাড়াই ফাংশনগুলির একটি সেট জুড়ে কিছু ডেটা ভাগ করে নেওয়া উপকারী। এটি জাভাস্ক্রিপ্টে বন্ধের সর্বাধিক সাধারণ ব্যবহার।

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

আপনি বিশ্বব্যাপী সুযোগকে রক্ষা করার চেয়ে ক্লোজারের সাথে আরও কিছু করতে পারেন তবে আপনি জেএস উত্স কোডে এটি দেখতে পাবেন।


9
এটি কোনও বন্ধ নয়। স্থানীয় সুযোগ তৈরি করতে আপনি ফাংশনগুলি ব্যবহার করে সুবিধাটি বর্ণনা করছেন।
রায়নস

2
বন্ধ যদি কেবলমাত্র ভেরিয়েবলের উপর বন্ধ হয় তবে এটি বন্ধ। এছাড়াও জাভাস্ক্রিপ্ট কীভাবে কাজ করে তা আমি জানি না বলে জানানোর জন্য আপনাকে ধন্যবাদ :)
রায়নোস

2
বরং জাভাস্ক্রিপ্ট এসও চ্যাট রুমে প্রকৃত যুক্তি উপস্থাপন করতে নির্দ্বিধায় আমাকে একজন প্রাক্তন ডাকার দ্বারা আমাকে অবজ্ঞা করার আশ্রয় নেওয়া । এই আলোচনাটি এখানে সত্যই অন্তর্ভুক্ত নয়, তবে আমি এস ও চ্যাটে আপনার ভ্রান্ত ধারণাটি আনন্দের সাথে আলোচনা করব।
রায়নস

1
Downvoted। জাভাস্ক্রিপ্ট প্রচুর অবজেক্ট ওরিয়েন্টেড। এটি কেবল শ্রেণিবদ্ধ নয় তবে এই জাতীয় কার্যকারিতা সহজেই রচিত হয় a এটি প্রথম শ্রেণীর ফাংশন রয়েছে, এটি ভারী ইভেন্ট-চালিত দৃষ্টান্তগুলির জন্য প্রাকৃতিক ফিট করার জন্য ক্লোজারগুলির সুবিধা গ্রহণ করে এবং এর লেখক ব্রেন্ডন আইচের মতে অনুপ্রেরণার একটি প্রধান উত্স ছিল স্কিম। আপনি কার্যকরী ভাষা কী ভাবেন তা আমি সত্যই নিশ্চিত নই, তবে মজার বিষয়টি হ'ল আপনি মনে করেন যে শ্রেণিভিত্তিক উত্তরাধিকারটি আপনি যখন চারপাশে ফাংশনগুলি পাস করতে এবং নতুন প্রসঙ্গে প্রয়োগ করতে পারেন তখন পুরোপুরি প্রয়োজনীয়তার চেয়ে কোনওরকম সমালোচনামূলক।
এরিক রিপেন

2
-1 পাশাপাশি। এটি ক্লোজারগুলি বর্ণনা করে না, এটি সুযোগকে বর্ণনা করে।
ইজকাটা

12

সম্ভবত কারণ জাভাস্ক্রিপ্টের অবজেক্ট ওরিয়েন্টেশনের জনপ্রিয় প্রয়োগগুলি ক্লোজারের উপর নির্ভর করে। আসুন একটি সহজ উদাহরণ তাকান:

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


3
-1 "ক্লোজারগুলির উপর নির্ভর করে" এটি অত্যন্ত আত্মনির্ভর। এটা না.
রায়নস

রায়নোস: ক্লোজার না করে কীভাবে ব্যক্তিগত সদস্য তৈরি এবং ব্যবহার করবেন তা আমাদের দেখানোর যত্ন?
ব্যবহারকারী 281377

1
@ammoQ জাভাস্ক্রিপ্টে ব্যক্তিগত বলে কোনও জিনিস নেই। আপনি যা বোঝাতে চেয়েছিলেন তা হ'ল "কারণ জাভাস্ক্রিপ্টের ধ্রুপদী ওও অনুকরণটি ক্লোজারের উপর নির্ভর করে"। জাভাস্ক্রিপ্ট ওও প্রোটোটাইপিকাল যা একটি পৃথক দৃষ্টান্ত। যদিও এই প্রশ্নের উত্তরের উত্তর, "আমরা জাভাস্ক্রিপ্টে
ক্লোজারগুলি

1
@ কেপপ্লা আমার অর্থ "ওও বন্ধের উপর নির্ভরশীল" বিষয়গত। আপনার মোটেও ওও এর জন্য ক্লোজারের দরকার নেই।
রায়নস

2
আমি যে প্রতিবেদক হিসাবে আছি তা আপনি আমাকে প্রকাশ করছেন ...
ব্যবহারকারীর 281377

4

কারণ জাভাস্ক্রিপ্টকে 'বহনযোগ্য' করে তোলে এমন অনেক লাইব্রেরি সেগুলি ব্যবহার করে।

কটাক্ষপাত JQuery , প্রোটোটাইপ বা MooTools শুধু তিনটি জনপ্রিয় নাম। এই লাইব্রেরির প্রত্যেকটি eachতাদের সংগ্রহের পুনরাবৃত্তির পছন্দসই উপায় হিসাবে একটি পদ্ধতি সরবরাহ করে যা একটি পুনরাবৃত্তকারী ফাংশন ব্যবহার করে। বাহ্যিক স্কোপগুলিতে মানগুলি অ্যাক্সেস করার সময়, এই ফাংশনটি বন্ধ হয়ে যাবে:

[1,2,3].each(function(item) {
   console.log(item);
});

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


1
কেন এটি বন্ধ নয়? console.logবাহ্যিক স্কোপে নির্দিষ্ট করা হয়, তেমনি consoleএকটি 'ফ্রি ভেরিয়েবল'। এবং, বাস্তবে, কেন একটি লুপ, যা কিছু আলাদা করে না, একটি খারাপ অভ্যাস?
কেপলা

@ রায়নোস: আমার ক্লোজারটির সংজ্ঞাটি হ'ল 'ব্লক যার মধ্যে একটি ফ্রি ভেরিয়েবল রয়েছে', এটি সেই স্ট্যাটাসটি ছেড়ে দেয় না, ফ্রি ভেরিয়েবলটি শীর্ষ সুযোগে রয়েছে। তবে, আমার বক্তব্য সমর্থন করার জন্য, এই পদ্ধতিটি বিবেচনা করুন: pastie.org/2144689 । কেন এই খারাপ হতে হবে?
কেপলা

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

মিনিমাইজ অ্যাক্সেসে সম্মত
কেপলা

এটি লক্ষ করা উচিত যে অ্যারে পুনরাবৃত্তকারী (forEach, মানচিত্র, হ্রাস, ইত্যাদি) দিয়ে তাদের বন্ধ হওয়ার শূন্য কারণ রয়েছে, তাদের সমস্ত রাজ্য সরাসরি তাদের মধ্যে প্রবেশ করিয়ে দিয়েছে। আমি এটি বন্ধ হয়ে যাওয়া তাদের বিরোধী
নিদর্শন

3

আমি অন্যান্য উত্তরের সাথে একমত যে জাভাস্ক্রিপ্টের সাথে "ভাল" কোডিং আরও বেশি ক্লোজারের উপর নির্ভরশীল। যাইহোক, এটি ছাড়াও, এটি সম্ভবত প্রতিটি ভাষাতে বৈশিষ্ট্যটি কত দিন ধরে রয়েছে তা কেবল একটি প্রশ্ন। জাভাস্ক্রিপ্টটির প্রাথমিকভাবে বাস্তবায়নকালের পরে বন্ধ রয়েছে। অন্যদিকে সি # এ কেবল তাদের 3.0 রয়েছে, যা ভিজ্যুয়াল স্টুডিও ২০০৮ দিয়ে প্রকাশ হয়েছিল।

আমি চালিত প্রচুর সি # প্রোগ্রামার এখনও 2.0 প্রকল্পে কাজ করছেন। এমনকি যদি তারা 3.0 বা 4.0 এ কাজ করে তবে তারা প্রায়শই 2.0 আইডিয়াম ব্যবহার করে। আমি ক্লোজার পছন্দ করি; আশা করা যায় যে তারা সি # তে আরও বেশি ব্যবহৃত হবে কারণ ধারণাটি সি # বিকাশকারীদের মধ্যে প্রচার করে।


2

এর মূল কারণ হ'ল সি # স্থিতিশীলভাবে টাইপ করা হয়েছে এবং ফাংশনগুলিতে কেবলমাত্র একটি একক, পূর্বনির্ধারিত পরিবেশে অ্যাক্সেস রয়েছে যা বন্ধ হওয়ার উপযোগিতা বাধা দেয়।

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


1
স্ট্যাটিক টাইপিং এর সাথে কী করার আছে? বন্ধগুলি অরথোগোনাল।

-1

তাদের সম্পর্কে আমার জানার একটি কারণ ছিল কারণ আপনি যখন ডিওএম উপাদানগুলির (বা সত্যিকারের কোনও কিছু) লুপ করছেন, আপনি পরিবর্তনশীল সুযোগটি "বন্ধ" বা "এনক্যাপসুলেট" করতে সক্ষম হতে চান। যেমন এখানে পোস্ট উদাহরণ হিসাবে: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable- for-later-execution

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