আমি এর অর্থ কী তা জানতাম তবে আমি এখন লড়াই করছি ...
এটি কি মূলত বলছে document.onload
?
(function () {
})();
আমি এর অর্থ কী তা জানতাম তবে আমি এখন লড়াই করছি ...
এটি কি মূলত বলছে document.onload
?
(function () {
})();
উত্তর:
এটি একটি অবিলম্বে- আমন্ত্রিত ফাংশন এক্সপ্রেশন , বা সংক্ষেপে IIFE এটি তৈরি হওয়ার সাথে সাথেই এটি কার্যকর করে।
কোনও ইভেন্টের (যেমন document.onload
) কোনও ইভেন্ট হ্যান্ডলারের সাথে এর কোনও যোগসূত্র নেই ।
প্রথম জুটির প্রথম জুটির অংশটি বিবেচনা করুন: .... এটি নিয়মিত ফাংশন প্রকাশ expression তারপরে শেষ জোড়াটি দেখুন , এটি সাধারণত কোনও ফাংশন কল করার জন্য একটি অভিব্যক্তিতে যুক্ত হয়; এই ক্ষেত্রে, আমাদের পূর্ব প্রকাশ।(function(){})();
(function(){})();
বিশ্বব্যাপী নেমস্পেসকে দূষিত করা এড়ানোর চেষ্টা করার সময় এই প্যাটার্নটি প্রায়শই ব্যবহৃত হয় কারণ আইআইএফইয়ের অভ্যন্তরে ব্যবহৃত সমস্ত ভেরিয়েবলগুলি (অন্য কোনও সাধারণ ফাংশনের মতো) এর আওতার বাইরে দৃশ্যমান নয়।
এ কারণেই, সম্ভবত আপনি কোনও ইভেন্ট হ্যান্ডলারের সাথে এই নির্মাণকে বিভ্রান্ত করেছেন window.onload
, কারণ এটি প্রায়শই এটি হিসাবে ব্যবহৃত হয়:
(function(){
// all your code here
var foo = function() {};
window.onload = foo;
// ...
})();
// foo is unreachable here (it’s undefined)
গুফা দ্বারা সংশোধন প্রস্তাবিত :
ফাংশনটি তৈরি হওয়ার সাথে সাথেই সম্পাদিত হয়, পার্স করার পরে নয়। এতে কোনও কোড কার্যকর হওয়ার আগে পুরো স্ক্রিপ্ট ব্লকটি পার্স করা হয়। এছাড়াও, পার্সিং কোডটি স্বয়ংক্রিয়ভাবে এর অর্থ এটি কার্যকর করা হয় না, উদাহরণস্বরূপ IIFE যদি কোনও ফাংশনের অভ্যন্তরে থাকে তবে ফাংশনটি না বলা পর্যন্ত এটি কার্যকর করা হবে না।
আপডেট যেহেতু এটি একটি দুর্দান্ত জনপ্রিয় বিষয়, এটি উল্লেখ করার মতো বিষয় যে আইএসএফ'কে ES6 এর তীর ফাংশন দিয়েও লেখা যেতে পারে (যেমন গাজুস একটি মন্তব্যে নির্দেশ করেছেন ):
((foo) => {
// do something with foo here foo
})('foo value')
function(){ var foo = '5'; }
এটি কেবলমাত্র একটি বেনাম ফাংশন যা এটি তৈরির পরেই কার্যকর করা হয়।
এটি ঠিক যেন আপনি এটিকে কোনও ভেরিয়েবলের জন্য বরাদ্দ করেছেন এবং কেবলমাত্র পরিবর্তনশীল ছাড়াই এটি ব্যবহার করেছেন:
var f = function () {
};
f();
JQuery এ একটি অনুরূপ নির্মাণ রয়েছে যা আপনি ভাবতে পারেন:
$(function(){
});
এটি ready
ইভেন্টটিকে আবদ্ধ করার সংক্ষিপ্ত রূপ :
$(document).ready(function(){
});
তবে উপরোক্ত দুটি কনস্ট্রাকশন IIFE গুলি নয়।
তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (IIFE) তত্ক্ষণাত কোনও ফাংশনকে কল করে। এর সহজ অর্থ হ'ল সংজ্ঞাটি সম্পূর্ণ হওয়ার সাথে সাথে ফাংশনটি কার্যকর করা হয়।
আরও তিনটি সাধারণ শব্দ:
// Crockford's preference - parens on the inside
(function() {
console.log('Welcome to the Internet. Please follow me.');
}());
//The OPs example, parentheses on the outside
(function() {
console.log('Welcome to the Internet. Please follow me.');
})();
//Using the exclamation mark operator
//https://stackoverflow.com/a/5654929/1175496
!function() {
console.log('Welcome to the Internet. Please follow me.');
}();
যদি এর ফেরতের মূল্যের জন্য কোনও বিশেষ প্রয়োজনীয়তা না থাকে তবে আমরা লিখতে পারি:
!function(){}(); // => true
~function(){}(); // => -1
+function(){}(); // => NaN
-function(){}(); // => NaN
বিকল্পভাবে, এটি হতে পারে:
~(function(){})();
void function(){}();
true && function(){ /* code */ }();
15.0, function(){ /* code */ }();
আপনি এমনকি লিখতে পারেন:
new function(){ /* code */ }
31.new function(){ /* code */ }() //If no parameters, the last () is not required
31.new
'অবৈধ সিনট্যাক্স
;(function(){}());
1 - 1
এবং আপনি সহজেই করতে পারেন true - function(){}
। এটি কেবল একটি জিনিস (একটি ইনফিক্স বিয়োগ অপারেটর) তবে বিভিন্ন, এমনকি অযৌক্তিক অপারেশন সহ।
এটি একটি অনামী কার্য ঘোষণা করে, তারপরে এটি কল করে:
(function (local_arg) {
// anonymous function
console.log(local_arg);
})(arg);
যে অবিলম্বে মৃত্যুদণ্ড কার্যকর বলছে।
তাই যদি আমি করি:
var val = (function(){
var a = 0; // in the scope of this function
return function(x){
a += x;
return a;
};
})();
alert(val(10)); //10
alert(val(11)); //21
ফিডল: http://jsfiddle.net/maniator/LqvpQ/
var val = (function(){
return 13 + 5;
})();
alert(val); //18
এই কনস্ট্রাক্টটিকে তাত্ক্ষণিকভাবে আমন্ত্রণযুক্ত ফাংশন এক্সপ্রেশন (IIFE) বলা হয় যার অর্থ এটি অবিলম্বে সম্পাদন করা হয়ে যায়। দোভাষী যখন এই ফাংশনে পৌঁছান তখন এটিকে স্বয়ংক্রিয়ভাবে কল হয়ে যাওয়া হিসাবে ভাবুন।
সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে:
এর সর্বাধিক প্রচলিত ব্যবহারের ক্ষেত্রে অন্যতম হল এর মাধ্যমে তৈরি ভেরিয়েবলের পরিধি সীমাবদ্ধ করা var
। এর মাধ্যমে তৈরি ভেরিয়েবলগুলির var
কোনও কার্যের মধ্যেই সীমাবদ্ধতা থাকে তাই এই কনস্ট্রাক্টটি (যা নির্দিষ্ট কোডের চারপাশে একটি ফাংশন আবরণ) এটি নিশ্চিত করবে যে আপনার ভেরিয়েবলের সুযোগটি সেই ফাংশনটির বাইরে চলে না doesn't
নিম্নলিখিত উদাহরণস্বরূপ, count
তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনটির বাইরে উপলব্ধ হবে না অর্থাৎ কার্যকারিতাটি বাইরে ফাংশন count
থেকে বেরিয়ে যাবে না। আপনার যদি একটি ReferenceError
তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনের বাইরে এটির অ্যাক্সেস করার চেষ্টা করা উচিত তবে একটি পাওয়া উচিত।
(function () {
var count = 10;
})();
console.log(count); // Reference Error: count is not defined
ES6 বিকল্প (প্রস্তাবিত)
ES6- এ এখন আমাদের মাধ্যমে let
এবং এর মাধ্যমে ভেরিয়েবলগুলি থাকতে পারে const
। উভয়ই ব্লক-স্কোপড (এর বিপরীতে var
যা ফাংশন-স্কোপযুক্ত)।
অতএব, আমি উপরে উল্লিখিত ব্যবহারের ক্ষেত্রে আইআইএফইর সেই জটিল নির্মাণটি ব্যবহার না করে আপনি এখন ভেরিয়েবলের সুযোগ আপনার কাঙ্ক্ষিত ব্লক থেকে ফাঁস না হয়ে যায় তা নিশ্চিত করার জন্য অনেক সহজ কোড লিখতে পারেন।
{
let count = 10;
}
console.log(count); // ReferenceError: count is not defined
এই উদাহরণে, আমরা ভেরিয়েবল let
সংজ্ঞায়িত করতাম count
যা count
কোডের ব্লককে সীমাবদ্ধ করে, আমরা কোঁকড়া বন্ধনী দিয়ে তৈরি করেছি {...}
।
আমি এটাকে "কোঁকড়ানো কারাগার" বলি।
(function () {
})();
একে আইআইএফই (তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন) বলা হয়। বিখ্যাত জাভাস্ক্রিপ্ট ডিজাইনের নিদর্শনগুলির মধ্যে একটি, এটি আধুনিক সময়ের মডিউল প্যাটার্নের হৃদয় এবং প্রাণ soul নাম অনুসারে এটি তৈরি হওয়ার সাথে সাথে এটি কার্যকর করে। এই প্যাটার্নটি নির্বাহের একটি বিচ্ছিন্ন বা ব্যক্তিগত সুযোগ তৈরি করে।
ECMAScript 6 এর আগে জাভাস্ক্রিপ্ট লেক্সিকাল স্কোপিং ব্যবহৃত হয়েছিল, তাই আইআইএফই ব্লক স্কোপিং অনুকরণের জন্য ব্যবহৃত হয়েছিল। (ECMAScript দ্বারা 6 টি ব্লক স্কোপিং let
এবং const
কীওয়ার্ডগুলি প্রবর্তনের মাধ্যমে সম্ভব ))
লেক্সিকাল স্কোপিংয়ের সাথে ইস্যুটির জন্য উল্লেখ
আইআইএফই দিয়ে ব্লক স্কোপিংয়ের অনুকরণ করুন
IIFE এর ব্যবহার কর্মক্ষমতা সুবিধা মত সাধারণভাবে ব্যবহৃত বিশ্বব্যাপী বস্তু পাস করার দক্ষতা window
, document
সুযোগ লুকআপ হ্রাস দ্বারা একটি আর্গুমেন্ট হিসাবে, ইত্যাদি। (মনে রাখবেন জাভাস্ক্রিপ্ট স্থানীয় সুযোগে সম্পত্তি অনুসন্ধান করে বিশ্বব্যাপী সুযোগ পর্যন্ত চেইন আপ করবে)। সুতরাং স্থানীয় সুযোগে বৈশ্বিক বস্তু অ্যাক্সেস নীচের মত চেহারা সময় হ্রাস করে।
(function (globalObj) {
//Access the globalObj
})(window);
না, এই নির্মাণটি কেবল নামকরণের সুযোগ তৈরি করে। আপনি যদি এটিগুলি অংশগুলিতে ভাঙ্গেন তবে দেখতে পাবেন যে আপনার একটি বাহ্যিক রয়েছে
(...)();
এটি একটি ফাংশন প্রার্থনা। আপনার প্রথম বন্ধনীর ভিতরে:
function() {}
এটি একটি বেনামে ফাংশন। কনস্ট্রাক্টের অভ্যন্তরে ভরের সাথে ঘোষিত সমস্ত কিছুই কেবল একই কনস্ট্রাক্টের অভ্যন্তরে দৃশ্যমান হবে এবং এটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করবে না।
এটি জাভাস্ক্রিপ্টে তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন:
জেএসে আইআইএফই বোঝার জন্য এটিকে ভেঙে দিন:
a = 10 output = 10 (1+3) output = 4
// Function Expression var greet = function(name){ return 'Namaste' + ' ' + name; } greet('Santosh');
ফাংশন এক্সপ্রেশন কীভাবে কাজ করে:
- যখন জেএস ইঞ্জিনটি প্রথমবারের জন্য চালিত হয় (এক্সিকিউশন কনটেক্সট - ফেজ তৈরি করুন), এই ফাংশনটি (উপরে = ডানদিকে ডানদিকে) কার্যকর হয় না বা মেমরিতে সঞ্চয় হয় না। পরিবর্তনশীল 'অভিবাদন' জেএস ইঞ্জিন দ্বারা 'অপরিবর্তিত' মান বরাদ্দ করা হয়।
- এক্সিকিউশন চলাকালীন (এক্সিকিউশন কনটেক্সট - এক্সিকিউট পর্ব), ফান অবজেক্ট ফ্লাইতে তৈরি হয় ( এটি এখনও কার্যকর হয় না ), 'গ্রিটি' ভেরিয়েবলকে অর্পণ করা হয় এবং এটি 'গ্রিটি (' কিছু নাম ')' ব্যবহার করে আহ্বান করা যেতে পারে।
3. অবিলম্বে অনুরোধ করা ফান্ট এক্সপ্রেশন:
উদাহরণ:
// IIFE
var greeting = function(name) {
return 'Namaste' + ' ' + name;
}('Santosh')
console.log(greeting) // Namaste Santosh.
IIFE কীভাবে কাজ করে :
- ফাংশন ঘোষণার পরপরই '()' লক্ষ্য করুন। প্রতিটি ফান্ট অবজেক্টের সাথে একটি 'কোড' সম্পত্তি যুক্ত থাকে যা কলযোগ্য। এবং আমরা '()' ধনুর্বন্ধনী ব্যবহার করে এটি কল করতে পারি (বা এটি প্রার্থনা করতে পারি)।
- সুতরাং এখানে, মৃত্যুদন্ড কার্যকর করার সময় (এক্সিকিউশন কনটেক্সট - এক্সিকিউট ফেজ) ফাংশন অবজেক্টটি তৈরি করা হয় এবং এটি একই সাথে কার্যকর করা হয়
- সুতরাং এখন, অভিবাদন ভেরিয়েবল, মজাদার বস্তুর পরিবর্তে তার রিটার্ন মান (একটি স্ট্রিং) রয়েছে
জেএসে আইআইএফই এর সাধারণ ব্যবহার
নিম্নলিখিত আইআইএফই প্যাটার্নটি বেশ ব্যবহৃত হয়।
// IIFE
// Spelling of Function was not correct , result into error
(function (name) {
var greeting = 'Namaste';
console.log(greeting + ' ' + name);
})('Santosh');
সুতরাং এই ফাংশনটি একই সময়ে (আইআইএফই) তৈরি এবং সম্পাদিত হয়।
IIFE এর জন্য গুরুত্বপূর্ণ ইউজকেস:
আইআইএফই আমাদের কোডটি সুরক্ষিত রাখে।
- আইআইএফই, একটি ফাংশন হওয়ার সাথে সাথে তার নিজস্ব নির্বাহের প্রসঙ্গ রয়েছে, যার অর্থ এটির ভিতরে তৈরি সমস্ত ভেরিয়েবলগুলি এই ফাংশনের স্থানীয় এবং এটি বিশ্বব্যাপী মৃত্যুদন্ড প্রসঙ্গে ভাগ করা হয় না।
ধরুন আমি আইপিএইজেএস সহ আমার অ্যাপ্লিকেশনটিতে আরও একটি জেএস ফাইল (test1.js) ব্যবহার করেছি (নীচে দেখুন)।
// test1.js
var greeting = 'Hello';
// iife.js
// Spelling of Function was not correct , result into error
(function (name) {
var greeting = 'Namaste';
console.log(greeting + ' ' + name);
})('Santosh');
console.log(greeting) // No collision happens here. It prints 'Hello'.
সুতরাং আইআইএফই আমাদের নিরাপদ কোড লিখতে সহায়তা করে যেখানে আমরা অজান্তেই বৈশ্বিক বস্তুর সাথে সংঘর্ষ করছি না।
এটি একটি স্ব-চালিত বেনাম ফাংশন ।
একটি স্ব-আমন্ত্রণমূলক ক্রিয়াকলাপের ডাব্লু 3 স্কুলগুলি দেখুন ।
ফাংশন এক্সপ্রেশন "স্ব-আমন্ত্রণমূলক" করা যেতে পারে।
একটি স্ব-আহ্বানকারী এক্সপ্রেশনটি ডাকা না হয়ে স্বয়ংক্রিয়ভাবে আহ্বান করা (শুরু) করা হয়।
এক্সপ্রেশনটি () দ্বারা অনুসরণ করা হলে ফাংশন এক্সপ্রেশনগুলি স্বয়ংক্রিয়ভাবে কার্যকর হবে।
আপনি কোনও ক্রিয়াকলাপের ঘোষণাকে স্ব-অনুরোধ করতে পারবেন না।
(function named(){console.log("Hello");}());
<- স্ব- কার্যনির্বাহিত নামকরণের ক্রিয়াকলাপ
এটি স্ব-চালিত বেনাম ফাংশন। এটি নির্ধারিত হওয়ার সময় এটি কার্যকর করা হয়। যার অর্থ এই ফাংশনটি সংজ্ঞায়িত হয় এবং সংজ্ঞা হওয়ার সাথে সাথেই নিজেকে অনুরোধ করে।
এবং সিনট্যাক্সের ব্যাখ্যাটি হ'ল: প্রথম প্রথম ()
বন্ধনের মধ্যে ফাংশনটি এমন কোনও ফাংশন যার কোনও নাম নেই এবং পরবর্তী ();
বন্ধনীর সাহায্যে আপনি বুঝতে পারবেন যে এটি সংজ্ঞায়িত হওয়ার সময় বলা হয়েছিল। এবং আপনি এই দ্বিতীয় ()
বন্ধনীর যে কোনও যুক্তি পাস করতে পারেন যা প্রথম প্রথম বন্ধনীতে রয়েছে এমন ফাংশনে ধরা হবে। এই উদাহরণটি দেখুন:
(function(obj){
// Do something with this obj
})(object);
আপনি যে 'অবজেক্ট'টি দিয়ে যাচ্ছেন তা ফাংশনের স্বাক্ষরে এটিকে ধরার সাথে সাথে' আপত্তি 'দ্বারা ফাংশনের মধ্যে অ্যাক্সেসযোগ্য হবে।
এখান থেকে শুরু কর:
var b = 'bee';
console.log(b); // global
এটি একটি ফাংশনে রাখুন এবং এটি আর বৈশ্বিক নয় - আপনার প্রাথমিক লক্ষ্য।
function a() {
var b = 'bee';
console.log(b);
}
a();
console.log(b); // ReferenceError: b is not defined -- *as desired*
তত্ক্ষণাত ফাংশনটি কল করুন - ওফস:
function a() {
var b = 'bee';
console.log(b);
}(); // SyntaxError: Expected () to start arrow function, but got ';' instead of '=>'
একটি সিনট্যাক্স ত্রুটি এড়ানোর জন্য প্রথম বন্ধনী ব্যবহার করুন:
(function a() {
var b = 'bee';
console.log(b);
})(); // OK now
আপনি ফাংশনটির নামটি ছেড়ে দিতে পারেন:
(function () { // no name required
var b = 'bee';
console.log(b);
})();
এর চেয়ে বেশি জটিল হওয়ার দরকার নেই।
Uncaught SyntaxError: Unexpected token )
তীর ফাংশনটির উল্লেখ না করে আসলে পাই actually তীর ফাংশন ত্রুটি নিক্ষেপ করে আপনি সম্ভবত একটি পদ্মফুল ভাগ করে নিতে পারেন?
স্ব-কার্যকরকারী বেনামি ফাংশন। এটি তৈরি হওয়ার সাথে সাথে এটি কার্যকর করা হয়।
এটি দরকারী যেখানে একটি সংক্ষিপ্ত এবং জঘন্য উদাহরণ:
function prepareList(el){
var list = (function(){
var l = [];
for(var i = 0; i < 9; i++){
l.push(i);
}
return l;
})();
return function (el){
for(var i = 0, l = list.length; i < l; i++){
if(list[i] == el) return list[i];
}
return null;
};
}
var search = prepareList();
search(2);
search(3);
সুতরাং প্রতিবার একটি তালিকা তৈরি করার পরিবর্তে, আপনি এটি একবারে তৈরি করুন (কম ওভারহেড)।
স্ব-সম্পাদনকারী ক্রিয়াকলাপগুলি সাধারণত প্রসঙ্গটি এনপ্যাপুলেট করতে এবং নাম কোলেশনগুলি এড়ানোর জন্য ব্যবহৃত হয়। (ফাংশন () {..}) () এর ভিতরে আপনি যে কোনও পরিবর্তনকটি সংজ্ঞায়িত করেছেন তা বৈশ্বিক নয়।
কোড
var same_name = 1;
var myVar = (function() {
var same_name = 2;
console.log(same_name);
})();
console.log(same_name);
এই আউটপুট উত্পাদন করে:
2
1
এই বাক্য গঠনটি ব্যবহার করে আপনি আপনার জাভাস্ক্রিপ্ট কোডে অন্য কোথাও ঘোষিত গ্লোবাল ভেরিয়েবলগুলির সাথে সংঘর্ষ এড়াতে পারবেন।
var same_name = 1; var myVar = function() { var same_name = 2; console.log(same_name); }; myVar(); console.log(same_name);
একই ফলাফল হবে।
একে আইআইএফই বলা হয় - তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন। এটির সিনট্যাক্স এবং ব্যবহার দেখানোর জন্য এখানে একটি উদাহরণ রয়েছে। এটি ভেরিয়েবলের ব্যবহারের সুযোগটি কেবল কার্যকারিতা অবধি ব্যবহার করা হয় এবং এর বাইরে নয়।
(function () {
function Question(q,a,c) {
this.q = q;
this.a = a;
this.c = c;
}
Question.prototype.displayQuestion = function() {
console.log(this.q);
for (var i = 0; i < this.a.length; i++) {
console.log(i+": "+this.a[i]);
}
}
Question.prototype.checkAnswer = function(ans) {
if (ans===this.c) {
console.log("correct");
} else {
console.log("incorrect");
}
}
var q1 = new Question('Is Javascript the coolest?', ['yes', 'no'], 0);
var q2 = new Question('Is python better than Javascript?', ['yes', 'no', 'both are same'], 2);
var q3 = new Question('Is Javascript the worst?', ['yes', 'no'], 1);
var questions = [q1, q2, q3];
var n = Math.floor(Math.random() * questions.length)
var answer = parseInt(prompt(questions[n].displayQuestion()));
questions[n].checkAnswer(answer);
})();
আইআইএফই (তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন) একটি ফাংশন যা স্ক্রিপ্টটি লোড হওয়ার সাথে সাথে চলে যায় utes
Iife.js নামের একটি ফাইলে লিখিত নীচের ফাংশনটি বিবেচনা করুন
(function(){
console.log("Hello Stackoverflow!");
})();
উপরের এই কোডটি আইফাইজেজেড লোড করার সাথে সাথেই কার্যকর হবে এবং ' হ্যালো স্ট্যাকওভারফ্লো ! 'বিকাশকারী সরঞ্জামগুলির' কনসোলে।
বিস্তারিত ব্যাখ্যার জন্য তাত্ক্ষণিকভাবে আমন্ত্রিত ফাংশন এক্সপ্রেশন (IIFE) দেখুন
আর একটি ব্যবহারের ক্ষেত্রে মেমোয়েজেশন যেখানে ক্যাশে অবজেক্টটি বিশ্বব্যাপী নয়:
var calculate = (function() {
var cache = {};
return function(a) {
if (cache[a]) {
return cache[a];
} else {
// Calculate heavy operation
cache[a] = heavyOperation(a);
return cache[a];
}
}
})();
তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (আইআইএফই) এমন একটি ফাংশন যা এটি তৈরির সাথে সাথেই সম্পাদন করা হয়। এটির কোনও ইভেন্ট বা অ্যাসিঙ্ক্রোনাস মৃত্যুদন্ডের সাথে কোনও সংযোগ নেই। আপনি নীচের মত একটি আইআইএফই সংজ্ঞায়িত করতে পারেন:
(function() {
// all your code here
// ...
})();
প্রথম বন্ধনীর প্রথম কার্যটি ফাংশন () {... inside প্রথম বন্ধনীর অভ্যন্তরে কোডটিকে একটি অভিব্যক্তিতে রূপান্তর করে The দ্বিতীয় যুগল বন্ধনীটি এক্সপ্রেশন থেকে প্রাপ্ত ফাংশনটিকে কল করে।
একটি IIFE
একটি স্ব-invoking বেনামী ফাংশন হিসাবে বর্ণনা করা যায়। এর সর্বাধিক সাধারণ ব্যবহার হ'ল ভেরিয়েবলের মাধ্যমে তৈরি করা একটি ভেরিয়েবলের পরিধি সীমাবদ্ধ করা বা নামের সংঘাতগুলি এড়ানোর জন্য প্রসঙ্গের এনক্যাপসুলেট করা।
স্বতঃ-নামকরণকারী বেনামি ফাংশনগুলি ব্যবহার করার কারণটি হ'ল এগুলি কখনই অন্য কোড দ্বারা কল করা উচিত নয় যেহেতু তারা কোডটি "সেট আপ" করে যার অর্থ কোড বলা হয় (ফাংশন এবং ভেরিয়েবলের সুযোগ দেওয়ার পাশাপাশি)।
অন্য কথায়, এগুলি প্রোগ্রামের শুরুতে "ক্লাস তৈরি করে" এমন প্রোগ্রামগুলির মতো। তারা তাত্ক্ষণিকভাবে (স্বয়ংক্রিয়ভাবে) পরে, কেবলমাত্র অনধিক ফাংশনগুলি পাওয়া যায় যা বেনাম ফাংশন দ্বারা ফিরে আসে However তবে, সমস্ত অন্যান্য ' লুকানো 'ফাংশনগুলি এখনও রয়েছে কোনও রাজ্যের সাথে (স্কোপ তৈরির সময় ভেরিয়েবলগুলি সেট করে)।
খুব ঠান্ডা.
নিম্নলিখিত কোড:
(function () {
})();
একে তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (IIFE) বলা হয়।
একে ফাংশন এক্সপ্রেশন বলা হয় কারণ ( yourcode )
জাভাস্ক্রিপ্টের অপারেটর এটিকে একটি অভিব্যক্তিতে জোর করে। একটি ফাংশন প্রকাশ এবং একটি ফাংশন ঘোষণার মধ্যে পার্থক্য নিম্নলিখিত:
// declaration:
function declaredFunction () {}
// expressions:
// storing function into variable
const expressedFunction = function () {}
// Using () operator, which transforms the function into an expression
(function () {})
একটি এক্সপ্রেশন হ'ল কোডের একগুচ্ছ যা একক মানকে মূল্যায়ন করা যায় । উপরের উদাহরণে প্রকাশের ক্ষেত্রে এই মানটি একক ফাংশন অবজেক্ট ছিল ।
পরে আমরা একটি অভিব্যক্তি যা পরে একটি ফাংশন বস্তুর আমরা মূল্যায়ণ থাকতে পারে অবিলম্বে ডাকা সঙ্গে ফাংশন বস্তুর ()
অপারেটর। উদাহরণ স্বরূপ:
(function() {
const foo = 10; // all variables inside here are scoped to the function block
console.log(foo);
})();
console.log(foo); // referenceError foo is scoped to the IIFE
যখন আমরা একটি বৃহত কোড বেস এবং / অথবা যখন আমরা বিভিন্ন লাইব্রেরি আমদানি করি তখন নামকরণের দ্বন্দ্ব বাড়ার সম্ভাবনা বেড়ে যায়। যখন আমরা কোনও আইআইএফই-এর ভিতরে সম্পর্কিত আমাদের কোডের কিছু অংশ লিখি যা (এবং এইভাবে একই ভেরিয়েবলগুলি ব্যবহার করছে) সমস্ত ভেরিয়েবল এবং ফাংশন নাম আইআইএফই এর ফাংশন বন্ধনীতে স্কোপ করা হয় । এটি দ্বন্দ্ব নামকরণের সম্ভাবনা হ্রাস করে এবং আপনাকে আরও গাফিলতির নাম দিতে দেয় (যেমন আপনাকে তাদের উপসর্গ দেওয়ার দরকার নেই)।
এই ফাংশনটিকে স্ব-চালিত ফাংশন বলা হয়। একটি স্ব-চালিত (যাকে স্ব-নির্বাহক বলা হয়) ফাংশন একটি নামহীন (বেনামে) ফাংশন যা সংজ্ঞার পরে অবিলম্বে ডাকা হয় (বলা হয়)।এখানে আরও পড়ুন
এই ফাংশনগুলি যা করে তা হ'ল যখন ফাংশনটি সংজ্ঞায়িত করা হয়, তখনই ফাংশনটিকে তত্ক্ষণাত ডাকা হয়, যা সময় এবং কোডের অতিরিক্ত লাইনগুলি সাশ্রয় করে (এটি একটি পৃথক লাইনে কল করার তুলনায়)।
এখানে একটি উদাহরণ:
(function() {
var x = 5 + 4;
console.log(x);
})();
আপনি কেন এটি ব্যবহার করবেন এটি এটির আরও গভীরভাবে ব্যাখ্যা:
"আইআইএফই ব্যবহারের প্রাথমিক কারণটি হ'ল ডেটা প্রাইভেসি অর্জন করা Because কারণ জাভাস্ক্রিপ্টের ভেরিয়েবলগুলি তাদের উপস্থিত ফাংশনটির ভেরিয়েবলগুলির জন্য, আইআইএফই-র মধ্যে ঘোষিত যে কোনও ভেরিয়েবলগুলি বাইরের বিশ্ব দ্বারা অ্যাক্সেস করতে পারে না।"
এটি একটি ফাংশন এক্সপ্রেশন, এটি অবিলম্বে আমন্ত্রিত ফাংশন এক্সপ্রেশন (IIFE) এর জন্য দাঁড়িয়েছে। আইআইএফই হ'ল একটি ফাংশন যা এটি তৈরির পরেই কার্যকর করা হয়। সুতরাং এটি কার্যকর করার জন্য ডাকা না হওয়া পর্যন্ত ফাংশনটির জন্য অপেক্ষা করা, তাত্ক্ষণিকভাবে আইআইএফই কার্যকর করা হয়। উদাহরণস্বরূপ আইআইএফই নির্মাণ করুন। ধরুন আমাদের একটি অ্যাড ফাংশন রয়েছে যা দুটি আর্গ হিসাবে দুটি পূর্ণসংখ্যা নেয় এবং যোগফলকে যোগ করে ফাংশনটিকে একটি আইআইএফইতে পরিণত করে,
পদক্ষেপ 1: ফাংশনটি সংজ্ঞায়িত করুন
function add (a, b){
return a+b;
}
add(5,5);
পদক্ষেপ 2: সম্পূর্ণ ফান্টিশন ডিক্লেয়ারেশনকে বন্ধনীতে মুড়িয়ে ফাংশনটি কল করুন
(function add (a, b){
return a+b;
})
//add(5,5);
পদক্ষেপ 3: তাত্ক্ষণিকভাবে ফাংশনটি শুরু করার জন্য কেবল কল থেকে 'অ্যাড' পাঠ্য সরিয়ে দিন।
(function add (a, b){
return a+b;
})(5,5);
আইএফএফই ব্যবহারের মূল কারণটি হ'ল আপনার ফাংশনের মধ্যে একটি ব্যক্তিগত সুযোগ সংরক্ষণ করা। আপনার জাভাস্ক্রিপ্ট কোডের অভ্যন্তরে আপনি এটি নিশ্চিত করতে চান যে আপনি কোনও গ্লোবাল ভেরিয়েবলকে অগ্রাহ্য করছেন না। কখনও কখনও আপনি দুর্ঘটনাক্রমে একটি পরিবর্তনশীল সংজ্ঞায়িত করতে পারেন যা একটি বৈশ্বিক চলককে ওভাররাইড করে। আসুন উদাহরণ দিয়ে চেষ্টা করুন। মনে করুন আমাদের কাছে iffe.html নামে একটি এইচটিএমএল ফাইল রয়েছে এবং বডি ট্যাগের অভ্যন্তরে কোডগুলি হ'ল-
<body>
<div id = 'demo'></div>
<script>
document.getElementById("demo").innerHTML = "Hello JavaScript!";
</script>
</body>
ঠিক আছে, উপরের কোডটি যে কোনও প্রশ্ন দিয়ে কার্যকর করবে, এখন ধরে নিই আপনি দুর্ঘটনাকৃত বা ইচ্ছাকৃত নামে একটি ভেরিয়েবল ডিক্লেয়ার্ড করেছেন।
<body>
<div id = 'demo'></div>
<script>
document.getElementById("demo").innerHTML = "Hello JavaScript!";
const document = "hi there";
console.log(document);
</script>
</body>
আপনি যদি একটি মধ্যে endup হবে বাক্যগঠনের ত্রুটি : অ কনফিগার বিশ্বব্যাপী সম্পত্তি নথির পুনঃঘোষণা।
তবে আপনার ইচ্ছাটি যদি কোনও পরিবর্তনশীল নাম ডকুমেট ডিক্লেইট করতে হয় তবে আপনি এটি আইএফএফই ব্যবহার করে করতে পারেন।
<body>
<div id = 'demo'></div>
<script>
(function(){
const document = "hi there";
this.document.getElementById("demo").innerHTML = "Hello JavaScript!";
console.log(document);
})();
document.getElementById("demo").innerHTML = "Hello JavaScript!";
</script>
</body>
আউটপুট:
আসুন অন্য একটি উদাহরণ দিয়ে চেষ্টা করুন, ধরুন আমাদের কাছে বেলো- এর মতো একটি ক্যালকুলেটর অবজেক্ট রয়েছে
<body>
<script>
var calculator = {
add:function(a,b){
return a+b;
},
mul:function(a,b){
return a*b;
}
}
console.log(calculator.add(5,10));
</script>
</body>
ঠিক আছে এটি একটি কবজির মতো কাজ করছে, যদি আমরা দুর্ঘটনাক্রমে ক্যালকুলেটর অবজেক্টের মূল্য পুনরায় ধারনা করি।
<body>
<script>
var calculator = {
add:function(a,b){
return a+b;
},
mul:function(a,b){
return a*b;
}
}
console.log(calculator.add(5,10));
calculator = "scientific calculator";
console.log(calculator.mul(5,5));
</script>
</body>
হ্যাঁ আপনি কোনও টাইপরর দিয়ে শেষ করবেন: ক্যালকুলেটর.মুল কোনও ফাংশন নয় iffe.html
তবে আইএফএফইর সহায়তায় আমরা একটি ব্যক্তিগত সুযোগ তৈরি করতে পারি যেখানে আমরা আরেকটি পরিবর্তনশীল নাম ক্যালকুলেটর তৈরি করতে পারি এবং এটি ব্যবহার করতে পারি;
<body>
<script>
var calculator = {
add:function(a,b){
return a+b;
},
mul:function(a,b){
return a*b;
}
}
var cal = (function(){
var calculator = {
sub:function(a,b){
return a-b;
},
div:function(a,b){
return a/b;
}
}
console.log(this.calculator.mul(5,10));
console.log(calculator.sub(10,5));
return calculator;
})();
console.log(calculator.add(5,10));
console.log(cal.div(10,5));
</script>
</body>
আমার মনে হয় 2 টি বন্ধনী সেটগুলি কিছুটা বিভ্রান্তিকর করে তোলে তবে আমি গুগলের উদাহরণে আরও একটি ব্যবহার দেখেছি, তারা অনুরূপ কিছু ব্যবহার করেছে, আমি আশা করি এটি আপনাকে আরও ভালভাবে বুঝতে সহায়তা করবে:
var app = window.app || (window.app = {});
console.log(app);
console.log(window.app);
সুতরাং যদি windows.app
এটি সংজ্ঞায়িত না করা হয়, তবে window.app = {}
তাৎক্ষণিকভাবে মৃত্যুদন্ড কার্যকর করা হবে, সুতরাং শর্ত মূল্যায়নের সময় window.app
নির্ধারিত হয় {}
, ফলে ফলাফল উভয়ই হয় app
এবং window.app
এখন হয়ে যায় {}
, সুতরাং কনসোল আউটপুটটি হ'ল:
Object {}
Object {}
সাধারণত, জাভাস্ক্রিপ্ট কোডটির প্রয়োগে বিশ্বব্যাপী সুযোগ রয়েছে। যখন আমরা এটিতে বিশ্বব্যাপী ভেরিয়েবল ঘোষণা করি, উন্নয়নের অন্য কোনও ক্ষেত্রে একই সদৃশ ভেরিয়েবলকে অন্য কোনও উদ্দেশ্যে ব্যবহার করার সুযোগ রয়েছে। এই সদৃশটির কারণে কিছু ত্রুটি ঘটতে পারে। সুতরাং আমরা তাত্ক্ষণিকভাবে ফাংশন এক্সপ্রেশনকে অনুরোধ করে এই বিশ্বব্যাপী পরিবর্তনগুলি এড়াতে পারি, এই অভিব্যক্তিটি স্ব-কার্যকরকারী অভিব্যক্তি W যখন আমরা এই কোডটি এই আইএফএফের ভিতরে করি তখন এক্সপ্রেশনটির গ্লোবাল ভেরিয়েবল স্থানীয় সুযোগ এবং স্থানীয় ভেরিয়েবলের মতো হবে।
দুটি উপায় যা আমরা আইআইএফই তৈরি করতে পারি
(function () {
"use strict";
var app = angular.module("myModule", []);
}());
অথবা
(function () {
"use strict";
var app = angular.module("myModule", []);
})();
উপরের কোড স্নিপেটে, “ ভার অ্যাপ্লিকেশন ” এখন একটি স্থানীয় ভেরিয়েবল।