জাভাস্ক্রিপ্টে আপনি কখন এটি ব্যবহার করতে চান:
(function(){
//Bunch of code...
})();
এটার উপরে:
//Bunch of code...
জাভাস্ক্রিপ্টে আপনি কখন এটি ব্যবহার করতে চান:
(function(){
//Bunch of code...
})();
এটার উপরে:
//Bunch of code...
উত্তর:
এগুলি সমস্ত পরিবর্তনশীল স্কোপিং সম্পর্কে। স্ব সম্পাদনকারী ফাংশনে ঘোষিত ভেরিয়েবলগুলি ডিফল্টরূপে কেবলমাত্র স্ব সম্পাদনকারী কার্যের মধ্যে কোডের জন্য উপলব্ধ to এটি জাভাস্ক্রিপ্ট কোডের অন্যান্য ব্লকে কীভাবে ভেরিয়েবলের নাম দেওয়া হয়েছে তা উদ্বেগ ছাড়াই কোড লেখার অনুমতি দেয়।
উদাহরণস্বরূপ, আলেকজান্ডারের একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে :
(function() {
var foo = 3;
console.log(foo);
})();
console.log(foo);
এটি প্রথমে লগ করবে 3
এবং তারপরে একটি ত্রুটি নিক্ষেপ করবে console.log
কারণ foo
সংজ্ঞায়িত নয়।
var
এই মত: ...function(){ foo=3;}
? এটি বিশ্বব্যাপী পরিবর্তনশীল সেট করবে, তাই না?
function(){ var foo = 3; alert(foo); }; alert(foo);
তাই আমি এখনও এটা পাবেন না
সরল. খুব স্বাভাবিক দেখাচ্ছে, এটি প্রায় আরামদায়ক:
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
যাইহোক, যদি আমি আমার পৃষ্ঠায় সত্যই কার্যকর জাভাস্ক্রিপ্ট লাইব্রেরি অন্তর্ভুক্ত করি যা উন্নত অক্ষরগুলিকে তাদের বেস স্তরের উপস্থাপনায় অনুবাদ করে?
কিসের অপেক্ষা?
আমি বলতে চাইছি, যদি কেউ কোনও চরিত্রটিতে কোনও ধরণের উচ্চারণ দিয়ে টাইপ করেন তবে আমি কেবল আমার প্রোগ্রামে 'ইংরাজী' অক্ষরগুলির এজেড চাই? আচ্ছা ... স্প্যানিশ 'ñ' এবং ফরাসি 'é' অক্ষরগুলি 'এন' এবং 'ই' এর বেস অক্ষরে অনুবাদ করা যেতে পারে।
সুতরাং কোনও ভাল ব্যক্তি একটি বিস্তৃত অক্ষর রূপান্তরকারী লিখেছেন যে আমি আমার সাইটে অন্তর্ভুক্ত করতে পারি ... আমি এটি অন্তর্ভুক্ত করি।
একটি সমস্যা: এটিতে আমার ফাংশনের মতো 'নাম' নামে পরিচিত একটি ফাংশন রয়েছে।
এটিকেই বলা হয় সংঘর্ষ। আমরা একই স্কোপে একই নামে দুটি ফাংশন ঘোষণা করেছি । আমরা এড়াতে চাই
সুতরাং আমাদের একরকমভাবে আমাদের কোড স্কোপ করা দরকার।
জাভাস্ক্রিপ্টে স্কোপ কোডের একমাত্র উপায় হ'ল এটি কোনও ফাংশনে মোড়ানো:
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
এটি আমাদের সমস্যার সমাধান করতে পারে। সবকিছু এখন বন্ধ এবং কেবল আমাদের খোলার এবং বন্ধ বন্ধনীগুলির মধ্যে থেকে অ্যাক্সেস করা যেতে পারে।
আমাদের একটি ফাংশনে একটি ফাংশন রয়েছে ... যা দেখতে অদ্ভুত তবে সম্পূর্ণ আইনী।
কেবল একটি সমস্যা। আমাদের কোড কাজ করে না। আমাদের ব্যবহারকারীর নাম পরিবর্তনশীলটি কখনই কনসোলটিতে প্রতিধ্বনিত হয় না!
আমরা আমাদের বিদ্যমান কোড ব্লকের পরে আমাদের ফাংশনে একটি কল যুক্ত করে এই সমস্যাটি সমাধান করতে পারি ...
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
main();
নাকি আগে!
main();
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
একটি গৌণ উদ্বেগ: 'মেইন' নামটি এখনও ব্যবহার করা হয়নি এমন সম্ভাবনা কী? ... খুব খুব পাতলা।
আমাদের আরও স্কোপিং দরকার। এবং আমাদের মূল () ফাংশনটি স্বয়ংক্রিয়ভাবে চালিত করার কিছু উপায়।
এখন আমরা অটো-এক্সিকিউশন ফাংশনগুলিতে (বা স্ব-কার্যকরকারী, স্ব-চলমান, যাই হোক না কেন) আসি।
((){})();
সিনট্যাক্সটি পাপ হিসাবে বিশ্রী। তবে এটি কাজ করে।
যখন আপনি বন্ধনীগুলিতে কোনও ফাংশন সংজ্ঞাটি আবদ্ধ করেন এবং একটি পরামিতি তালিকা অন্তর্ভুক্ত করেন (অন্য সেট বা বন্ধনী!) এটি একটি ফাংশন কল হিসাবে কাজ করে ।
সুতরাং কিছু স্ব-সম্পাদনকারী সিনট্যাক্স সহ আমাদের কোডটি আবার দেখা যাক:
(function main() {
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
)();
সুতরাং, বেশিরভাগ টিউটোরিয়ালে আপনি পড়েছেন, আপনি এখন 'বেনামে স্ব-কার্যকরকারী' শব্দটি বা অনুরূপ কিছু নিয়ে বোমাবর্ষণ করবেন।
বহু বছরের পেশাদার বিকাশের পরে, আমি আপনাকে দৃ every ়ভাবে অনুরোধ করছি আপনার লেখা প্রতিটি ফাংশনটির নাম দিন ডিবাগিংয়ের উদ্দেশ্যে ।
যখন কোনও কিছু ভুল হয়ে যায় (এবং এটি হবে), আপনি আপনার ব্রাউজারে ব্যাকট্রেস পরীক্ষা করে দেখবেন। এটা সর্বদা হয়যখন স্ট্যাক ট্রেসটিতে প্রবেশের নাম থাকে তখন আপনার কোডের সমস্যাগুলি সংকীর্ণ সহজ!
বিশালভাবে দীর্ঘ-বায়ুযুক্ত এবং আমি আশা করি এটি সাহায্য করবে!
:)
স্ব-অনুরোধ (স্ব-অনুরোধ হিসাবেও পরিচিত) হ'ল যখন কোনও ক্রিয়া সংজ্ঞায়িত হওয়ার সাথে সাথেই সম্পাদন করে। এটি একটি মূল নিদর্শন এবং জাভাস্ক্রিপ্ট বিকাশের অন্যান্য অনেক নিদর্শনগুলির ভিত্তি হিসাবে কাজ করে।
আমি একটি দুর্দান্ত ভক্ত :) এর কারণ:
প্রচুর - (কেন আপনি এটি ভাল বলা উচিত?)
আরও এখানে ।
Namespacing। জাভাস্ক্রিপ্টের স্কোপগুলি ফাংশন-স্তরের।
আমি জবাব দিতে পারি না এমন উত্তরের কোনটিই গ্লোবালগুলিকে উল্লেখ করে না।
(function(){})()
কনস্ট্রাক্ট উহ্য globals, যা আমার কাছে বড় উদ্বেগের বিষয় বিরুদ্ধে রক্ষা করে না দেখতে http://yuiblog.com/blog/2006/06/01/global-domination/
মূলত ফাংশন ব্লকটি নিশ্চিত করে যে আপনি নির্ধারিত সমস্ত নির্ভরশীল "গ্লোবাল ওয়ার" আপনার প্রোগ্রামের মধ্যে সীমাবদ্ধ রয়েছে, এটি আপনাকে অন্তর্ভুক্ত গ্লোবালগুলি সংজ্ঞায়িত করার হাত থেকে রক্ষা করে না। JSHint বা অন্যান্য কীভাবে এই আচরণের বিরুদ্ধে রক্ষা করতে হবে সে সম্পর্কে প্রস্তাবনা সরবরাহ করতে পারে।
আরও সংক্ষিপ্ত var App = {}
বাক্য গঠন একই ধরণের সুরক্ষা সরবরাহ করে এবং 'সর্বজনীন' পৃষ্ঠায় থাকাকালীন ফাংশন ব্লকে মোড়ানো হতে পারে। (দেখুন Ember.js বা SproutCore লাইব্রেরি বাস্তব জগতে উদাহরণ যে এই কনস্ট্রাক্ট ব্যবহারের জন্য)
private
সম্পত্তি হিসাবে যতক্ষণ না যায়, তারা কোনও ধরণের ওভাররেটেড হয় যদি না আপনি কোনও পাবলিক ফ্রেমওয়ার্ক বা লাইব্রেরি তৈরি করেন তবে আপনার যদি এগুলি প্রয়োগ করার প্রয়োজন হয় তবে ডগলাস ক্রকফোর্ডের কিছু ভাল ধারণা রয়েছে।
আমি সমস্ত উত্তর পড়েছি, খুব গুরুত্বপূর্ণ কিছু এখানে অনুপস্থিত , আমি কিস করব। এখানে দুটি প্রধান কারণ রয়েছে, কেন আমাকে স্ব-সম্পাদনকারী অনামী কার্যাদি প্রয়োজন বা আরও ভাল " তাত্ক্ষণিকভাবে আহ্বান করা ফাংশন এক্সপ্রেশন (IIFE) " বলেছেন:
প্রথমটি খুব ভালভাবে ব্যাখ্যা করা হয়েছে। দ্বিতীয়টির জন্য, দয়া করে নিম্নলিখিত উদাহরণটি অধ্যয়ন করুন:
var MyClosureObject = (function (){
var MyName = 'Michael Jackson RIP';
return {
getMyName: function () { return MyName;},
setMyName: function (name) { MyName = name}
}
}());
মনোযোগ 1: আমরা কোনও ফাংশন বরাদ্দ করছি না MyClosureObject
, আরও আরও এই ফাংশনটি আহ্বানের ফলাফল । ()
শেষ লাইনে সচেতন হন ।
মনোযোগ 2: জাভাস্ক্রিপ্টের ফাংশনগুলি সম্পর্কে আপনার অতিরিক্ত যা জানতে হবে তা হ'ল অভ্যন্তরীণ ফাংশনগুলি প্যারামিটার এবং ভেরিয়েবলগুলিতে অ্যাক্সেস পায় , সেগুলি এর মধ্যে সংজ্ঞায়িত করা হয়।
আসুন আমরা কিছু পরীক্ষা-নিরীক্ষা চেষ্টা করি:
আমি MyName
ব্যবহার করতে পারি getMyName
এবং এটি কাজ করে:
console.log(MyClosureObject.getMyName());
// Michael Jackson RIP
নিম্নলিখিত উদ্ভাবনী পদ্ধতির কাজ করবে না:
console.log(MyClosureObject.MyName);
// undefined
তবে আমি একটি অন্য নাম সেট করতে এবং প্রত্যাশিত ফলাফল পেতে পারি:
MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName());
// George Michael RIP
সম্পাদনা করুন: উপরের উদাহরণে উপসর্গ MyClosureObject
ব্যতীত ব্যবহারের জন্য ডিজাইন করা হয়েছে new
, সুতরাং কনভেনশন দ্বারা এটি মূলধন করা উচিত নয়।
কোনও প্যারামিটার আছে এবং "গুচ্ছের কোড" কোনও ফাংশন দেয়?
var a = function(x) { return function() { document.write(x); } }(something);
বন্ধ। something
নির্ধারিত ফাংশনটির দ্বারা ব্যবহৃত মান a
। something
কিছুটা পৃথক মান (লুপের জন্য) থাকতে পারে এবং প্রতিটি সময় একটি নতুন ফাংশন থাকে।
var x = something;
বাহ্যিক ক্রিয়াকলাপে একটি স্পষ্টতাকে পছন্দ করি x
, যদিও: ইমো এটি এইভাবে আরও পঠনযোগ্য ...
x
রাখেন এবং সরাসরি লেক্সিকাল স্কোপেসের উপর নির্ভর করেন তবে নতুন মান ব্যবহৃত হবে document.write(something)
...
ব্যাপ্তি বিচ্ছিন্নতা, হতে পারে। যাতে ফাংশন ঘোষণার ভিতরে ভেরিয়েবলগুলি বাইরের নেমস্পেসকে দূষিত না করে।
অবশ্যই, সেখানে অর্ধেক জেএস বাস্তবায়ন, তারা যাইহোক।
একটি স্বতঃপ্রণোদিত বেনামী ফাংশন কীভাবে কার্যকর হতে পারে তার একটি দৃ example় উদাহরণ এখানে।
for( var i = 0; i < 10; i++ ) {
setTimeout(function(){
console.log(i)
})
}
আউটপুট: 10, 10, 10, 10, 10...
for( var i = 0; i < 10; i++ ) {
(function(num){
setTimeout(function(){
console.log(num)
})
})(i)
}
আউটপুট: 0, 1, 2, 3, 4...
let
পরিবর্তে var
প্রথম ক্ষেত্রে ঠিক হয়ে যাবে।
যেহেতু জাভাস্ক্রিপ্টে ফাংশনগুলি প্রথম শ্রেণীর অবজেক্ট, সেভাবে এটি সংজ্ঞায়িত করে, এটি কার্যকরভাবে সি ++ বা সি # এর মতো একটি "শ্রেণি" সংজ্ঞায়িত করে।
এই ফাংশনটি স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারে এবং এর মধ্যে ফাংশন থাকতে পারে। অভ্যন্তরীণ ফাংশনগুলি (কার্যকরভাবে উদাহরণ পদ্ধতিগুলি) স্থানীয় ভেরিয়েবলগুলিতে অ্যাক্সেস করতে পারে (কার্যকরভাবে ভেরিয়েবলগুলি) তবে এগুলি স্ক্রিপ্টের বাকী অংশ থেকে পৃথক করা হবে।
জাভাস্ক্রিপ্টে স্ব-স্বাক্ষরিত ফাংশন:
একটি স্ব-আহ্বানকারী এক্সপ্রেশনটি ডাকা না হয়ে স্বয়ংক্রিয়ভাবে আহ্বান করা (শুরু) করা হয়। একটি স্ব-আমন্ত্রণমূলক এক্সপ্রেশনটি তৈরি হওয়ার সাথে সাথেই অনুরোধ করা হয়। এটি মূলত বিরোধের নামকরণ এড়াতে পাশাপাশি এনক্যাপসুলেশন অর্জনের জন্য ব্যবহৃত হয়। ভেরিয়েবল বা ঘোষিত বস্তুগুলি এই ফাংশনের বাইরে অ্যাক্সেসযোগ্য নয়। কমানোর সমস্যা এড়াতে (ফাইলের নাম.মিন) সর্বদা স্ব সম্পাদিত ফাংশন ব্যবহার করুন।
ভেরিয়েবলের স্কোপ পরিচালনা করতে স্ব-সম্পাদনকারী কার্য ব্যবহৃত হয়।
একটি ভেরিয়েবলের সুযোগ হ'ল আপনার প্রোগ্রামের অঞ্চলটি যেখানে এটি সংজ্ঞায়িত করা হয়।
একটি বৈশ্বিক পরিবর্তনশীল এর বিশ্বব্যাপী সুযোগ রয়েছে; এটি আপনার জাভাস্ক্রিপ্ট কোডের সর্বত্র সংজ্ঞায়িত হয়েছে এবং স্ক্রিপ্টের মধ্যে যে কোনও জায়গা থেকে এমনকি আপনার ফাংশনেও এটি অ্যাক্সেস করা যায়। অন্যদিকে, একটি ফাংশনের মধ্যে ঘোষিত ভেরিয়েবলগুলি কেবল ফাংশনের মূল অংশের মধ্যেই সংজ্ঞায়িত করা হয়। এগুলি স্থানীয় পরিবর্তনশীল, স্থানীয় সুযোগ রয়েছে এবং কেবলমাত্র সেই ক্রিয়াকলাপের মধ্যেই এটি অ্যাক্সেস করা যায়। ফাংশন প্যারামিটারগুলি স্থানীয় ভেরিয়েবল হিসাবে গণনা করে এবং কেবলমাত্র ফাংশনের মূল অংশের মধ্যেই সংজ্ঞায়িত করা হয়।
নীচে প্রদর্শিত হিসাবে, আপনি আপনার ফাংশনের অভ্যন্তরে বৈশ্বিক পরিবর্তনশীল ভেরিয়েবল অ্যাক্সেস করতে পারেন এবং এটিও নোট করতে পারেন যে কোনও ফাংশনের মূল অংশে, একটি স্থানীয় ভেরিয়েবল একই নামের সাথে একটি বৈশ্বিক পরিবর্তনশীলের চেয়ে অগ্রাধিকার গ্রহণ করে।
var globalvar = "globalvar"; // this var can be accessed anywhere within the script
function scope() {
alert(globalvar);
localvar = "localvar" //can only be accessed within the function scope
}
scope();
সুতরাং মূলত একটি স্ব সম্পাদনকারী ক্রিয়াকলাপ জাভাস্ক্রিপ্ট কোডের অন্যান্য ব্লকে কীভাবে ভেরিয়েবলের নামকরণ করা হয়েছে তা উদ্বেগ ছাড়াই কোড লেখার অনুমতি দেয়।
(function(){
var foo = {
name: 'bob'
};
console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error
প্রকৃতপক্ষে, উপরের ফাংশনটি নাম ছাড়াই ফাংশন এক্সপ্রেশন হিসাবে বিবেচনা করা হবে।
ঘনিষ্ঠ এবং উন্মুক্ত বন্ধনী দিয়ে কোনও ফাংশন মোড়ানোর মূল উদ্দেশ্য হ'ল বৈশ্বিক স্থানকে দূষিত করা এড়ানো।
ফাংশন এক্সপ্রেশন ভিতরে ভেরিয়েবল এবং ফাংশন ব্যক্তিগত হয়ে উঠেছে (অর্থাত্) তারা ফাংশনের বাইরে উপলব্ধ হবে না।
সংক্ষিপ্ত উত্তর হ'ল: গ্লোবাল (বা উচ্চতর) সুযোগের দূষণ রোধ করা।
আইআইএফই (তাত্ক্ষণিকভাবে আমন্ত্রিত ফাংশন এক্সপ্রেশনস) হ'ল স্ক্রিপ্টগুলি প্লাগ-ইনস, অ্যাড-অনস, ব্যবহারকারী স্ক্রিপ্ট বা অন্য যে কোনও স্ক্রিপ্টের সাথে অন্য ব্যক্তির স্ক্রিপ্টগুলির সাথে কাজ করার আশা করা হয় তা লেখার জন্য সেরা অনুশীলন । এটি নিশ্চিত করে যে আপনার নির্ধারিত কোনও পরিবর্তনশীল অন্যান্য স্ক্রিপ্টগুলিতে অনাকাঙ্ক্ষিত প্রভাব দেয় না।
এটি আইআইএফই এক্সপ্রেশন লেখার অন্য উপায়। আমি ব্যক্তিগতভাবে এই নিম্নলিখিত পদ্ধতিটি পছন্দ করি:
void function() {
console.log('boo!');
// expected output: "boo!"
}();
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
উপরের উদাহরণ থেকে এটি অত্যন্ত স্পষ্ট যে আইআইএফই দক্ষতা এবং কার্য সম্পাদনকেও প্রভাবিত করতে পারে, কারণ যে ফাংশনটি কেবল একবার চালানো হবে বলে আশা করা হচ্ছে তা একবার কার্যকর করা হবে এবং তারপরে ভালর জন্য শূন্যে ফেলে দেওয়া হবে । এর অর্থ হ'ল ফাংশন বা পদ্ধতি ঘোষণা মেমরিতে থাকে না।
void
আগে এর ব্যবহার দেখিনি । আমি এটা পছন্দ করি.
প্রথমে আপনাকে অবশ্যই MDN IIFE দেখতে হবে , এখন এই সম্পর্কে কয়েকটি পয়েন্ট points
দেখে মনে হচ্ছে এই প্রশ্নের উত্তর প্রস্তুত হয়ে গেছে তবে আমি আমার ইনপুট যাইহোক পোস্ট করব।
আমি জানি যখন আমি স্ব-কার্যকরকারী কার্যাদি ব্যবহার করতে চাই।
var myObject = {
childObject: new function(){
// bunch of code
},
objVar1: <value>,
objVar2: <value>
}
ফাংশনটি আমাকে ক্লিনার কোডের জন্য চাইল্ডঅবজেক্টস বৈশিষ্ট্য এবং বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার জন্য কিছু অতিরিক্ত কোড ব্যবহার করার অনুমতি দেয় যেমন সাধারণভাবে ব্যবহৃত ভেরিয়েবলগুলি সেট করা বা গাণিতিক সমীকরণগুলি সম্পাদন করা; উহু! বা ত্রুটি পরীক্ষা করা। এর নেস্টেড অবজেক্ট ইনস্ট্যান্টিয়েশন সিনট্যাক্সের মধ্যে সীমাবদ্ধ থাকার বিপরীতে ...
object: {
childObject: {
childObject: {<value>, <value>, <value>}
},
objVar1: <value>,
objVar2: <value>
}
সাধারণভাবে কোডিংয়ের একই জিনিসগুলি প্রচুর করার জন্য অনেক অস্পষ্ট উপায় রয়েছে যা আপনাকে অবাক করে তোলে, "কেন বিরক্ত করবেন?" তবে নতুন পরিস্থিতি পপ আপ করে রাখে যেখানে আপনি আর বেসিক / কোর প্রিন্সিপালের উপর নির্ভর করতে পারবেন না।
আপনার সাধারণ প্রশ্নটি দেওয়া: "জাভাস্ক্রিপ্টে আপনি কখন এটি ব্যবহার করতে চান: ..."
আমি @ একন_ব্রাউনিং এবং @ শন_হোল্ডিংয়ের উত্তরগুলি পছন্দ করি তবে এখানে আরও একটি ব্যবহার-মামলা রয়েছে যা আমি উল্লেখ করি না:
let red_tree = new Node(10);
(async function () {
for (let i = 0; i < 1000; i++) {
await red_tree.insert(i);
}
})();
console.log('----->red_tree.printInOrder():', red_tree.printInOrder());
যেখানে নোড ইন্ডিট্রেট কিছু অ্যাসিনক্রোনাস অ্যাকশন।
আমি আমার ফাংশনটির ঘোষণায় অ্যাসিঙ্ক কীওয়ার্ড ব্যতীত কেবল অপেক্ষা করতে পারি না, এবং পরে ব্যবহারের জন্য আমার নামকরণের ফাংশনটির প্রয়োজন নেই, তবে সেই সন্নিবেশ কলটির জন্য অপেক্ষা করতে হবে বা আমার আরও কিছু সমৃদ্ধ বৈশিষ্ট্য প্রয়োজন (কে জানে?) ।
আইআইআরসি এটি আপনাকে ব্যক্তিগত সম্পত্তি এবং পদ্ধতিগুলি তৈরি করতে দেয়।