জাভাস্ক্রিপ্টে (ফাংশন () {}) () কী তৈরি করা হয়?


790

আমি এর অর্থ কী তা জানতাম তবে আমি এখন লড়াই করছি ...

এটি কি মূলত বলছে document.onload?

(function () {

})();

20
বিটিডব্লিউ, যদিও আপনি দেখবেন লোকেরা এই ফাংশনটিকে 'স্ব-আহ্বানকারী' বলে ডাকে, এটি স্পষ্টভাবে সত্য নয়। আইফাই শব্দটি নির্ভুলতার সুবিধা রয়েছে।
আকাশম

6
এটি এই নির্মাণের দুর্দান্ত ব্যাখ্যা দেয়। "আইআইএফই" শব্দটির উদ্ভব এখানেও হয়েছিল। benalman.com/news/2010/11/…
জেরেমিসউইজ


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

উত্তর:


854

এটি একটি অবিলম্বে- আমন্ত্রিত ফাংশন এক্সপ্রেশন , বা সংক্ষেপে 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')

@ gion_13 সৃষ্টি পর্ব এবং পার্স ফেজের মধ্যে পার্থক্য কী?
একান্টওয়ার্ড

1
@ জ্লেই আমি যেভাবে দেখছি, একটি জেএস প্রোগ্রামের জীবনচক্রের মধ্যে নিম্নলিখিত ধাপগুলি অন্তর্ভুক্ত রয়েছে: পার্সিং, সৃষ্টি / সংকলন, সম্পাদন। যদিও প্রকৃত বাস্তবায়ন (এবং নামকরণ :)) ব্রাউজার থেকে ব্রাউজারে পৃথক হতে পারে, তবুও ত্রুটি পার্সিং, উত্তোলন এবং সময় ত্রুটিগুলি পার্স করার জন্য আমরা আমাদের কোডে এই পর্যায়গুলি নির্ধারণ করতে পারি। আমি ব্যক্তিগতভাবে এটিতে অনেক সংস্থান খুঁজে পাইনি কারণ এটি খুব নিম্ন স্তরের এবং এটি এমন কিছু নয় যা প্রোগ্রামার নিয়ন্ত্রণ করতে পারে। : আপনি এই তাই পোস্টে ব্যাখ্যা কিছু বাছাই জানতে পারেন stackoverflow.com/a/34562772/491075
gion_13

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

কীভাবে এটি বৈশ্বিক নাম স্থান দূষিত করছে? foo কোনওভাবেই ফাংশনের বাইরে পাওয়া যায় না। function(){ var foo = '5'; }
পঙ্কজ

1
@ পঙ্কজ - নিজে থেকে নেওয়া, এটি সিন্টেক্সিকভাবে বৈধ জেএসও নয় (এটি একটি ফাংশন এক্সপ্রেশন তবে এক্সপ্রেশন প্রসঙ্গে নয় তাই একটি সিনট্যাক্স ত্রুটি হিসাবে বিবেচিত হয়)।
কোয়ান্টিন

109

এটি কেবলমাত্র একটি বেনাম ফাংশন যা এটি তৈরির পরেই কার্যকর করা হয়।

এটি ঠিক যেন আপনি এটিকে কোনও ভেরিয়েবলের জন্য বরাদ্দ করেছেন এবং কেবলমাত্র পরিবর্তনশীল ছাড়াই এটি ব্যবহার করেছেন:

var f = function () {
};
f();

JQuery এ একটি অনুরূপ নির্মাণ রয়েছে যা আপনি ভাবতে পারেন:

$(function(){
});

এটি readyইভেন্টটিকে আবদ্ধ করার সংক্ষিপ্ত রূপ :

$(document).ready(function(){
});

তবে উপরোক্ত দুটি কনস্ট্রাকশন IIFE গুলি নয়।


83
শেষ দুটি সত্যিই আইআইএফই নয়, যেহেতু তারা যখন ডম প্রস্তুত হয় এবং তত্ক্ষণাত্
ডাকা

15
@ সাওয়ার্ডফেইন: হ্যাঁ, এটি সঠিক, তারা আইআইএফই নয়।
গুফা

@ এসওয়ার্ডফেইন দ্বিতীয় স্নিপেট বিবেচনা করে; ফাংশনটি আইআইএফএতে রূপান্তরিত করে শেষে () যুক্ত করার কি কোনও মান থাকবে?
সময়বন্ধিত

শেষে কি সেমিকোলনটি প্রয়োজনীয়?
ফ্রেনকিবি 31'17

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

52

তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (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

4
শেষটি 31.new'অবৈধ সিনট্যাক্স
বিড়াল

9
একই জিনিস লেখার এত উপায় কেন? !! > _ <আমি এই ভাষাটি পছন্দ করি না
অসাধারণ_জাগল

6
আর বিজয়ী হলেন;(function(){}());
রোকো সি

ক্রকফোর্ডের পছন্দ ব্যাখ্যাটি খুব দরকারী ছিল - আমি বন্যের মধ্যে যে পার্থক্য দেখেছি তা ব্যাখ্যা করে, উদাহরণস্বরূপ, jQuery ক্ষুদ্র-পাবসব গিস্ট এক সংস্করণ থেকে অন্য সংস্করণে বদলে গেছে (আপনি ফাইলের শেষে পরিবর্তনটি দেখতে পারেন) এবং আমি পারলাম না ' কেন খুঁজে বের করতে হবে না।
icc97

1
@ অসাধারণ_গর্ল: এটি নয় যে একই জিনিস লেখার অনেকগুলি উপায় রয়েছে; এটি হ'ল জেএসের অপারেটরগুলির সাথে একটি আলগা টাইপ সিস্টেম রয়েছে যা কোনও মান ধরণের উপর পরিচালনা করতে পারে। আপনি করতে পারেন 1 - 1এবং আপনি সহজেই করতে পারেন true - function(){}। এটি কেবল একটি জিনিস (একটি ইনফিক্স বিয়োগ অপারেটর) তবে বিভিন্ন, এমনকি অযৌক্তিক অপারেশন সহ।

31

এটি একটি অনামী কার্য ঘোষণা করে, তারপরে এটি কল করে:

(function (local_arg) {
   // anonymous function
   console.log(local_arg);
})(arg);

আমার ধারণা "আর্গুমেন্টগুলি" এমন বাহ্যিক ভেরিয়েবল যা ফাংশনের মধ্যে স্থানীয় প্রসঙ্গে ব্যবহার করতে "আর্গ" হিসাবে উল্লেখ করা হয়?
ডালিবোর

@Dalibor argumentsহয় বিশেষ ; আমার অনুমানটি উত্তরগুলি সবে উল্টে গেছে যেখানে নামগুলি যায়
বিড়াল

29

যে অবিলম্বে মৃত্যুদণ্ড কার্যকর বলছে।

তাই যদি আমি করি:

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

1
আমি এটি পাব না যা এটির আত্মপ্রক্রমণের প্রমাণ দেয়?
Exitos

1
এক্সজিটিস কারণ এটি ফাংশনটি ফিরিয়ে দেয়। আমি একটি দ্বিতীয় উদাহরণ দিতে।
নফতালি ওরফে নিল

বুঝতে খুব সহজ +1
আদিআইই

24

এই কনস্ট্রাক্টটিকে তাত্ক্ষণিকভাবে আমন্ত্রণযুক্ত ফাংশন এক্সপ্রেশন (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কোডের ব্লককে সীমাবদ্ধ করে, আমরা কোঁকড়া বন্ধনী দিয়ে তৈরি করেছি {...}

আমি এটাকে "কোঁকড়ানো কারাগার" বলি।


10
আমি কুঁকড়ানো জেল নামকরণ পছন্দ। হতে পারে এটি আটকে থাকবে :)
gion_13

15
(function () {
})();

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

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

আইআইএফই দিয়ে ব্লক স্কোপিংয়ের অনুকরণ করুন

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

(function (globalObj) {
//Access the globalObj
})(window);

আইআইএফই-তে দ্বিতীয় বন্ধনী বোঝার জন্য সংক্ষিপ্তসার দেওয়ার জন্য আপনাকে ধন্যবাদ। এছাড়াও সংজ্ঞা অনুযায়ী সংজ্ঞা দিয়ে গ্লোবাল ভেরিয়েবলের অনুসন্ধানের সময় সুবিধাটি স্পষ্ট করার জন্য
আর্সাল

11

না, এই নির্মাণটি কেবল নামকরণের সুযোগ তৈরি করে। আপনি যদি এটিগুলি অংশগুলিতে ভাঙ্গেন তবে দেখতে পাবেন যে আপনার একটি বাহ্যিক রয়েছে

(...)();

এটি একটি ফাংশন প্রার্থনা। আপনার প্রথম বন্ধনীর ভিতরে:

function() {}

এটি একটি বেনামে ফাংশন। কনস্ট্রাক্টের অভ্যন্তরে ভরের সাথে ঘোষিত সমস্ত কিছুই কেবল একই কনস্ট্রাক্টের অভ্যন্তরে দৃশ্যমান হবে এবং এটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করবে না।


11

এটি জাভাস্ক্রিপ্টে তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন:

জেএসে আইআইএফই বোঝার জন্য এটিকে ভেঙে দিন:

  1. এক্সপ্রেশন : এমন কোনও কিছু যা একটি মান দেয়
    উদাহরণ: ক্রোম কনসোলে নিম্নলিখিত চেষ্টা করে দেখুন। এগুলি জেএসে প্রকাশ করা।
a = 10 
output = 10 
(1+3) 
output = 4
  1. ফাংশন এক্সপ্রেশন :
    উদাহরণ:
// 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'.

সুতরাং আইআইএফই আমাদের নিরাপদ কোড লিখতে সহায়তা করে যেখানে আমরা অজান্তেই বৈশ্বিক বস্তুর সাথে সংঘর্ষ করছি না।


যদি আমরা আইআইএফই-এর ভিতরে ফাংশন তৈরি করি তবে আমরা কীভাবে তাদেরকে অন্য কিছু জেএস বা জেএসএক্স ফাইলগুলিতে অ্যাক্সেস করতে পারি অর্থাৎ প্রতিক্রিয়া উপাদানটিতে।
পাথর রক

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

6

এটি একটি স্ব-চালিত বেনাম ফাংশন

একটি স্ব-আমন্ত্রণমূলক ক্রিয়াকলাপের ডাব্লু 3 স্কুলগুলি দেখুন ।

ফাংশন এক্সপ্রেশন "স্ব-আমন্ত্রণমূলক" করা যেতে পারে।

একটি স্ব-আহ্বানকারী এক্সপ্রেশনটি ডাকা না হয়ে স্বয়ংক্রিয়ভাবে আহ্বান করা (শুরু) করা হয়।

এক্সপ্রেশনটি () দ্বারা অনুসরণ করা হলে ফাংশন এক্সপ্রেশনগুলি স্বয়ংক্রিয়ভাবে কার্যকর হবে।

আপনি কোনও ক্রিয়াকলাপের ঘোষণাকে স্ব-অনুরোধ করতে পারবেন না।


3
(function named(){console.log("Hello");}());<- স্ব- কার্যনির্বাহিত নামকরণের ক্রিয়াকলাপ
ব্রাইক

@ ব্রাইক আপনি এমন কোনও ক্রিয়াকলাপের নাম রাখবেন যার নামটির দরকার নেই।
রিকার্ডো গোনজালেস

2
@ রিকার্ডো গনজালেস পুনরাবৃত্তি আমার ধারণা
ব্রাইক

5

এটি স্ব-চালিত বেনাম ফাংশন। এটি নির্ধারিত হওয়ার সময় এটি কার্যকর করা হয়। যার অর্থ এই ফাংশনটি সংজ্ঞায়িত হয় এবং সংজ্ঞা হওয়ার সাথে সাথেই নিজেকে অনুরোধ করে।

এবং সিনট্যাক্সের ব্যাখ্যাটি হ'ল: প্রথম প্রথম ()বন্ধনের মধ্যে ফাংশনটি এমন কোনও ফাংশন যার কোনও নাম নেই এবং পরবর্তী ();বন্ধনীর সাহায্যে আপনি বুঝতে পারবেন যে এটি সংজ্ঞায়িত হওয়ার সময় বলা হয়েছিল। এবং আপনি এই দ্বিতীয় ()বন্ধনীর যে কোনও যুক্তি পাস করতে পারেন যা প্রথম প্রথম বন্ধনীতে রয়েছে এমন ফাংশনে ধরা হবে। এই উদাহরণটি দেখুন:

(function(obj){
    // Do something with this obj
})(object);

আপনি যে 'অবজেক্ট'টি দিয়ে যাচ্ছেন তা ফাংশনের স্বাক্ষরে এটিকে ধরার সাথে সাথে' আপত্তি 'দ্বারা ফাংশনের মধ্যে অ্যাক্সেসযোগ্য হবে।


2
এই প্রশ্নের ইতিমধ্যে একটি স্বীকৃত উত্তর রয়েছে এবং আপনার উত্তরটিতে এমন কোনও কিছু যুক্ত হয় না যা ইতিমধ্যে গৃহীত উত্তরের আওতায় আসে নি। অতএব, এই উত্তরটি লেখার প্রয়োজন ছিল না।
এডিট এম শাহ

3
আমি একাধিক উত্তর পড়তে পছন্দ করি, কখনও কখনও এক বা অন্যের বাক্যটি আলাদা করে।

আমি ভেবেছিলাম এটি যুক্ত হয়েছে কারণ এটি আমাকে জানতে দেয় যে দ্বিতীয় বন্ধনীর দ্বিতীয় সেটটি কী ছিল। কমপক্ষে এটি এখানে পরিষ্কার ছিল যা আমি দেখেছি।
জননি

আমার ফেভ উত্তর আইআইএফই নমুনার উভয় প্রান্তের প্যারামিটার রয়েছে এবং উভয়ের মধ্যে ম্যাপিংটি সরল করা হয়েছে।
স্টিফেন ডাব্লু রাইট

4

এখান থেকে শুরু কর:

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);
})();

এর চেয়ে বেশি জটিল হওয়ার দরকার নেই।


2
সিনট্যাক্স ত্রুটিটি তীর ফাংশন সম্পর্কে কথা বলছে। আমি যেমন বুঝতে পেরেছি, এটি জেএসের একটি নতুন বৈশিষ্ট্য, এবং এটি কয়েক বছর আগে উপস্থিত ছিল না, তবে আইআইএফই তা করেছে। সুতরাং, প্রথমটি সম্ভবত সিন্থ্যাক্স ত্রুটি এড়াতে মূলত ব্যবহৃত হয়েছিল, তবে আলাদা?
জে কার্লোসআর 14

আপনি দয়া করে @ জে কার্লোস প্রশ্নের উত্তর দিতে পারেন? যেহেতু তিনি বেশ যথাযথভাবে উল্লেখ করেছেন যে আইফোনটি তীর ফাংশনের আগে অনেক আগে এসেছিল, কেন এটি মোড়ানো প্রয়োজন তা বুঝতে সাহায্য করবে।
স্ক্রিপ্ট 47

@ স্ক্রিপ্ট 47 মন্তব্যে জ্যাকার্লোসের প্রশ্নের উত্তর আমার কাছে নেই। আপনি একটি নতুন প্রশ্ন তৈরি করতে এবং এটি পোস্ট করতে পারেন, এবং আমি নিশ্চিত যে আপনি কিছু ভাল উত্তর পাবেন।
জিম বন্যা

@ জ্যাকার্লোস যখন আমি ত্রুটি নিক্ষেপকারীকে সম্পাদন করি তখন আমি Uncaught SyntaxError: Unexpected token )তীর ফাংশনটির উল্লেখ না করে আসলে পাই actually তীর ফাংশন ত্রুটি নিক্ষেপ করে আপনি সম্ভবত একটি পদ্মফুল ভাগ করে নিতে পারেন?
স্ক্রিপ্ট 47

2

স্ব-কার্যকরকারী বেনামি ফাংশন। এটি তৈরি হওয়ার সাথে সাথে এটি কার্যকর করা হয়।

এটি দরকারী যেখানে একটি সংক্ষিপ্ত এবং জঘন্য উদাহরণ:

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);

সুতরাং প্রতিবার একটি তালিকা তৈরি করার পরিবর্তে, আপনি এটি একবারে তৈরি করুন (কম ওভারহেড)।


1
লিখিত হিসাবে, আপনার অনুসন্ধান প্রতিটি অনুরোধে তালিকাটি পুনর্নির্মাণ করে। এটি এড়াতে আপনাকে (1) তালিকা তৈরি করতে হবে এবং (২) সবেমাত্র তৈরি করা তালিকায় অ্যাক্সেস থাকার কারণে বন্ধ হওয়া হিসাবে অনুসন্ধান ফাংশনটি ফিরিয়ে দিতে হবে। এটি আপনি বেনামে স্ব-আহ্বানকারী ফর্মটি সহজেই ব্যবহার করতে পারেন। Jsfiddle.net/BV4bT দেখুন ।
জর্জ

আপনি কি ব্যাখ্যা করতে পারেন ... কম ওভারহেড .. আমি এই অংশটি বুঝতে পারি
হীরা ঠাকুর

2
ওভারহেড মানে কোনও কাজ সম্পাদন করা যা প্রয়োজনীয় নয়। প্রতিটি ফাংশন আমন্ত্রণের জন্য একটি অ্যারের পপুলেশন করা প্রয়োজন হয় না, এজন্য উদাহরণে একটি অ্যারে সেল্-এক্সিকিউট দ্বারা পপুলেটেড হয়। প্রথমবারের জন্য বেনামে ফাংশন। যাইহোক, মনে হচ্ছে আমি আমার নিজের উত্তরে ভুল করেছি, উপযুক্ত উদাহরণের জন্য জর্জের মন্তব্যে লিঙ্কটি দেখুন।
usoban

2

স্ব-সম্পাদনকারী ক্রিয়াকলাপগুলি সাধারণত প্রসঙ্গটি এনপ্যাপুলেট করতে এবং নাম কোলেশনগুলি এড়ানোর জন্য ব্যবহৃত হয়। (ফাংশন () {..}) () এর ভিতরে আপনি যে কোনও পরিবর্তনকটি সংজ্ঞায়িত করেছেন তা বৈশ্বিক নয়।

কোড

var same_name = 1;

var myVar = (function() {
    var same_name = 2;
    console.log(same_name);
})();

console.log(same_name);

এই আউটপুট উত্পাদন করে:

2
1

এই বাক্য গঠনটি ব্যবহার করে আপনি আপনার জাভাস্ক্রিপ্ট কোডে অন্য কোথাও ঘোষিত গ্লোবাল ভেরিয়েবলগুলির সাথে সংঘর্ষ এড়াতে পারবেন।


1
ঠিক আছে, আউটপুটটি 2 এবং তারপরে 1 হবে কারণ মাইভার প্রথমে চালিত হবে
ডালিবোর

1
আপনার ব্যাখ্যা ফাংশনের সুযোগ ব্যাখ্যা করার ক্ষেত্রে ভাল করে তবে এটি কেন অবিলম্বে সম্পাদন করা হয় তা ব্যাখ্যা করতে কম falls এটিকে ভেরিয়েবলে অর্পণ করা স্ব পরাজিত এবং এটিও একাধিকবার সম্পাদন করা যেতে পারে nd var same_name = 1; var myVar = function() { var same_name = 2; console.log(same_name); }; myVar(); console.log(same_name); একই ফলাফল হবে।
domenicr

2

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

(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);
})();

1

আইআইএফই (তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন) একটি ফাংশন যা স্ক্রিপ্টটি লোড হওয়ার সাথে সাথে চলে যায় utes

Iife.js নামের একটি ফাইলে লিখিত নীচের ফাংশনটি বিবেচনা করুন

(function(){
       console.log("Hello Stackoverflow!");
   })();

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

বিস্তারিত ব্যাখ্যার জন্য তাত্ক্ষণিকভাবে আমন্ত্রিত ফাংশন এক্সপ্রেশন (IIFE) দেখুন


1

আর একটি ব্যবহারের ক্ষেত্রে মেমোয়েজেশন যেখানে ক্যাশে অবজেক্টটি বিশ্বব্যাপী নয়:

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];
    }
  }
})();

0

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

(function() {
     // all your code here
     // ...
})();

প্রথম বন্ধনীর প্রথম কার্যটি ফাংশন () {... inside প্রথম বন্ধনীর অভ্যন্তরে কোডটিকে একটি অভিব্যক্তিতে রূপান্তর করে The দ্বিতীয় যুগল বন্ধনীটি এক্সপ্রেশন থেকে প্রাপ্ত ফাংশনটিকে কল করে।

একটি IIFEএকটি স্ব-invoking বেনামী ফাংশন হিসাবে বর্ণনা করা যায়। এর সর্বাধিক সাধারণ ব্যবহার হ'ল ভেরিয়েবলের মাধ্যমে তৈরি করা একটি ভেরিয়েবলের পরিধি সীমাবদ্ধ করা বা নামের সংঘাতগুলি এড়ানোর জন্য প্রসঙ্গের এনক্যাপসুলেট করা।


0

স্বতঃ-নামকরণকারী বেনামি ফাংশনগুলি ব্যবহার করার কারণটি হ'ল এগুলি কখনই অন্য কোড দ্বারা কল করা উচিত নয় যেহেতু তারা কোডটি "সেট আপ" করে যার অর্থ কোড বলা হয় (ফাংশন এবং ভেরিয়েবলের সুযোগ দেওয়ার পাশাপাশি)।

অন্য কথায়, এগুলি প্রোগ্রামের শুরুতে "ক্লাস তৈরি করে" এমন প্রোগ্রামগুলির মতো। তারা তাত্ক্ষণিকভাবে (স্বয়ংক্রিয়ভাবে) পরে, কেবলমাত্র অনধিক ফাংশনগুলি পাওয়া যায় যা বেনাম ফাংশন দ্বারা ফিরে আসে However তবে, সমস্ত অন্যান্য ' লুকানো 'ফাংশনগুলি এখনও রয়েছে কোনও রাজ্যের সাথে (স্কোপ তৈরির সময় ভেরিয়েবলগুলি সেট করে)।

খুব ঠান্ডা.


0

নিম্নলিখিত কোড:

(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

কেন এটি দরকারী?

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


0

ES6 সিনট্যাক্সে (নিজের জন্য পোস্ট করা, যেমন আমি এই পৃষ্ঠায় অবতরণ করে যাচ্ছি একটি দ্রুত উদাহরণ খুঁজছি):

// simple
const simpleNumber = (() => {
  return true ? 1 : 2
})()

// with param
const isPositiveNumber = ((number) => {
  return number > 0 ? true : false
})(4)

0

এই ফাংশনটিকে স্ব-চালিত ফাংশন বলা হয়। একটি স্ব-চালিত (যাকে স্ব-নির্বাহক বলা হয়) ফাংশন একটি নামহীন (বেনামে) ফাংশন যা সংজ্ঞার পরে অবিলম্বে ডাকা হয় (বলা হয়)।এখানে আরও পড়ুন

এই ফাংশনগুলি যা করে তা হ'ল যখন ফাংশনটি সংজ্ঞায়িত করা হয়, তখনই ফাংশনটিকে তত্ক্ষণাত ডাকা হয়, যা সময় এবং কোডের অতিরিক্ত লাইনগুলি সাশ্রয় করে (এটি একটি পৃথক লাইনে কল করার তুলনায়)।

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

(function() {
    var x = 5 + 4;
    console.log(x);
})();


0

আপনি কেন এটি ব্যবহার করবেন এটি এটির আরও গভীরভাবে ব্যাখ্যা:

"আইআইএফই ব্যবহারের প্রাথমিক কারণটি হ'ল ডেটা প্রাইভেসি অর্জন করা Because কারণ জাভাস্ক্রিপ্টের ভেরিয়েবলগুলি তাদের উপস্থিত ফাংশনটির ভেরিয়েবলগুলির জন্য, আইআইএফই-র মধ্যে ঘোষিত যে কোনও ভেরিয়েবলগুলি বাইরের বিশ্ব দ্বারা অ্যাক্সেস করতে পারে না।"

http://adripofjavascript.com/blog/drips/an-introduction-to-iffes-immediately-invoked-function-expressions.html


0

এটি একটি ফাংশন এক্সপ্রেশন, এটি অবিলম্বে আমন্ত্রিত ফাংশন এক্সপ্রেশন (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>

আউটপুট: এখানে চিত্র বর্ণনা লিখুন


-1

আমার মনে হয় 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 {}

-1

সাধারণত, আমরা প্রোগ্রামে এটি লেখার সাথে সাথে কোনও ফাংশন শুরু করি না। অত্যন্ত সাধারণ ভাষায়, আপনি যখন কোনও ক্রিয়াকলাপটি তৈরির ঠিক পরে বলছেন, তখন এটি আইআইএফই - একটি অভিনব নাম called


-1

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

দুটি উপায় যা আমরা আইআইএফই তৈরি করতে পারি

(function () {
    "use strict";
    var app = angular.module("myModule", []);
}());

অথবা

(function () {
    "use strict";
    var app = angular.module("myModule", []);
})();

উপরের কোড স্নিপেটে, “ ভার অ্যাপ্লিকেশন ” এখন একটি স্থানীয় ভেরিয়েবল।

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