জাভাস্ক্রিপ্টে একটি স্ব সম্পাদনকারী কার্যের উদ্দেশ্য কী?


427

জাভাস্ক্রিপ্টে আপনি কখন এটি ব্যবহার করতে চান:

(function(){
    //Bunch of code...
})();

এটার উপরে:

//Bunch of code...



সেমিকোলনের ঠিক আগে কেন এটি শেষ দুটি প্রথম বন্ধনী রয়েছে?
জনি

3
এই শেষ দু'টি প্রথম বন্ধনী কোনও (অজ্ঞাতনামা) ফাংশন ঘোষণার আগে @ জোহনি অংশ। এই দুটি বন্ধনী ফাংশন কল।
এজে।

7
"তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন" বা আইআইএফই এর জন্য আরও ভাল নাম
Flimm

উত্তর:


404

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

উদাহরণস্বরূপ, আলেকজান্ডারের একটি মন্তব্যে যেমন উল্লেখ করা হয়েছে :

(function() {
  var foo = 3;
  console.log(foo);
})();

console.log(foo);

এটি প্রথমে লগ করবে 3এবং তারপরে একটি ত্রুটি নিক্ষেপ করবে console.logকারণ fooসংজ্ঞায়িত নয়।


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

2
সুতরাং এর অর্থ, এটি বেশিরভাগ বন্ধের সাথে ব্যবহৃত হয়?
পীর আবদুল

@AlexanderBird, বেশ না করার অধিকার ... যদি তোমাকে ছাড়া কি varএই মত: ...function(){ foo=3;}? এটি বিশ্বব্যাপী পরিবর্তনশীল সেট করবে, তাই না?
টুডো

2
@AlexanderBird কিন্তু যে ইতিমধ্যে ফাংশন ভিতরে স্থানীয় ভেরিয়েবল ঘটবে: function(){ var foo = 3; alert(foo); }; alert(foo);তাই আমি এখনও এটা পাবেন না
জোয়াও মধ্যে Pimentel ফেরেইরা

আহ, আমি পেয়েছি, আপনি একবারে এই 3 টি বৈশিষ্ট্য অর্জন করেছেন: 1) আপনি কেবলমাত্র এটি ঘোষণা করে ফাংশনটি সম্পাদন করেন; 2) কোনও ফাংশন হিসাবে ভেরিয়েবলের সুযোগটি কেবল স্থানীয়; এবং 3) ফাংশন বেনামী, প্রধান সুযোগ দূষণ নাও হতে পারে
জোয়াও মধ্যে Pimentel ফেরেইরা

94

সরল. খুব স্বাভাবিক দেখাচ্ছে, এটি প্রায় আরামদায়ক:

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 ়ভাবে অনুরোধ করছি আপনার লেখা প্রতিটি ফাংশনটির নাম দিন ডিবাগিংয়ের উদ্দেশ্যে ।

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

বিশালভাবে দীর্ঘ-বায়ুযুক্ত এবং আমি আশা করি এটি সাহায্য করবে!


2
আপনাকে ধন্যবাদ :) আমি ভেরিয়েবল প্রাইভেসির ক্ষেত্রে সাধারণ ক্রিয়াকলাপের ক্ষেত্রে আইআইএফইর সুবিধাগুলি বোঝার চেষ্টা করার চারদিকে ইন্টারনেট অনুসন্ধান করেছিলাম এবং আপনার উত্তরটি সবচেয়ে ভাল। প্রত্যেকে বলেছেন যে সর্বোত্তম সুবিধাগুলির মধ্যে একটি হ'ল আইফএফের অভ্যন্তরে ভেরিয়েবল এবং ফাংশনগুলি 'অবশেষে' ব্যক্তিগত হয় যখন কোনও সাধারণ ফাংশন আপনাকে ঠিক একই জিনিস দেয়। অবশেষে আমি মনে করি এটি আপনার ব্যাখ্যা প্রক্রিয়াটির মাধ্যমে পেয়েছি। আইআইএফই সর্বোপরি একটি ফাংশন তবে এখন কেন এটি ব্যবহার করব তা আমি বুঝতে পেরেছি again আপনাকে আবার ধন্যবাদ!
viery365

এটিকে এত ভালভাবে ব্যাখ্যা করতে সময় দেওয়ার জন্য ধন্যবাদ।
এমএসসি

চমৎকার উত্তর. আপনার শেষ পয়েন্টে আমার একটি প্রশ্ন রয়েছে, যদিও - আপনি যখন সমস্ত ফাংশনগুলির নামকরণ করার পরামর্শ দিচ্ছেন, আপনি কি বলছেন স্ব-সম্পাদনকারী ক্রিয়াকলাপগুলির সাথে এটি করার একটি উপায় আছে, বা ফাংশনটির নামকরণের পরে সবাই এটি কল করার পরামর্শ দিচ্ছেন? ওহ সম্পাদনা করুন, আমি দেখতে পাচ্ছি। এই এক ইতিমধ্যে নাম দেওয়া হয়েছে। Duh। আপনি যে কোনও নামযুক্ত স্ব-কার্যকরকারী কার্যকারিতাটি আপনার ন্যায্যতা প্রমাণ করতে চান তা উল্লেখ করতে চাই।
ফায়ারসবার্নস্মোপ

ভাল আমার বন্ধু, এটিই আমি উত্তরটি খুঁজছিলাম:)
জোও পিমেন্টেল

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

32

স্ব-অনুরোধ (স্ব-অনুরোধ হিসাবেও পরিচিত) হ'ল যখন কোনও ক্রিয়া সংজ্ঞায়িত হওয়ার সাথে সাথেই সম্পাদন করে। এটি একটি মূল নিদর্শন এবং জাভাস্ক্রিপ্ট বিকাশের অন্যান্য অনেক নিদর্শনগুলির ভিত্তি হিসাবে কাজ করে।

আমি একটি দুর্দান্ত ভক্ত :) এর কারণ:

  • এটি সর্বনিম্ন কোড রাখে
  • এটি উপস্থাপনা থেকে আচরণের বিচ্ছেদকে কার্যকর করে
  • এটি একটি ক্লোজার সরবরাহ করে যা নামকরণের বিরোধকে বাধা দেয়

প্রচুর - (কেন আপনি এটি ভাল বলা উচিত?)

  • এটি একবারে কোনও ক্রিয়াকলাপ সংজ্ঞায়িত এবং সম্পাদন করা সম্পর্কে।
  • আপনি যে স্ব-সম্পাদনকারী ফাংশনটি একটি মান ফিরিয়ে দিতে এবং কোনও ফাংশনকে পরম হিসাবে অন্য ফাংশনে পাস করতে পারেন।
  • এটি encapsulation জন্য ভাল।
  • এটি ব্লক স্কোপিংয়ের জন্যও ভাল।
  • হ্যাঁ, আপনি নিজের সমস্ত .js ফাইলগুলিকে একটি স্ব-সম্পাদনকারী কার্যক্রমে সংযুক্ত করতে পারেন এবং বিশ্বব্যাপী নেমস্পেস দূষণ রোধ করতে পারেন। ;)

আরও এখানে


43
পয়েন্ট 1. কিভাবে? পয়েন্ট ২. এটি সম্পূর্ণ ভিন্ন সেরা অনুশীলন থেকে। পয়েন্ট 3. কোন ফাংশন না? 4,5,6,7। সংশ্লিষ্টতা? ৮. ঠিক আছে, আমার ধারণা 1/8 খারাপ নয়।
এরিক পুনরায়

2
সাত বছর দেরি হলেও, পয়েন্ট 1 এর জন্য এটি কোডটি মোটেও হ্রাস করে না, আসলে এটি ফাংশনটি তৈরিতে নূন্যতম দুটি লাইন কোড যুক্ত করে।
ইয়ুংগুন

1
এখানে কেবলমাত্র পয়েন্টটি হ'ল "এটি একটি ক্লোজার সরবরাহ করে যা নামকরণের বিরোধকে বাধা দেয়", প্রতিটি অন্যান্য পয়েন্ট এটির পুনর্নির্মাণ বা মিথ্যা। আপনি আপনার উত্তর সহজ করতে পারেন?
প্যাকারভালহো

19

Namespacing। জাভাস্ক্রিপ্টের স্কোপগুলি ফাংশন-স্তরের।


7
downvotes এখনও কারণ আমি ব্যবহৃত আসছে namespacing এর instad scoping ; এটি সংজ্ঞার বিষয় - দেখুন উইকিপিডিয়া : কম্পিউটার বিজ্ঞানের একটি নেমস্পেস (কখনও কখনও এটি নাম স্কোপও বলা হয়), একটি বিমূর্ত ধারক বা পরিবেশ যা অনন্য শনাক্তকারী বা চিহ্নগুলির (যেমন, নাম) যৌক্তিক দলবদ্ধকরণের জন্য তৈরি করা হয়। এবং একটি নেমস্পেস শনাক্তকারী কোনও নামের প্রসঙ্গে (কম্পিউটার বিজ্ঞানের স্কোপ) সরবরাহ করতে পারে এবং শর্তগুলি মাঝে মাঝে বিনিময়যোগ্য হিসাবে ব্যবহৃত হয়।
ক্রিস্টোফ

5
জাভাস্ক্রিপ্টের ফাংশন-স্তরের স্কোপগুলি স্থান পরিবর্তন করে যা ভেরিয়েবলের নামগুলি থাকে, একটি নেমস্পেস ; যে এটি কোনও নামবিহীন যা নামপরিচয় শনাক্তকারীর সাথে সম্পর্কিত নয় তা অপ্রাসঙ্গিক ...
ক্রিস্টোফ

12

আমি জবাব দিতে পারি না এমন উত্তরের কোনটিই গ্লোবালগুলিকে উল্লেখ করে না।

(function(){})()কনস্ট্রাক্ট উহ্য globals, যা আমার কাছে বড় উদ্বেগের বিষয় বিরুদ্ধে রক্ষা করে না দেখতে http://yuiblog.com/blog/2006/06/01/global-domination/

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

আরও সংক্ষিপ্ত var App = {}বাক্য গঠন একই ধরণের সুরক্ষা সরবরাহ করে এবং 'সর্বজনীন' পৃষ্ঠায় থাকাকালীন ফাংশন ব্লকে মোড়ানো হতে পারে। (দেখুন Ember.js বা SproutCore লাইব্রেরি বাস্তব জগতে উদাহরণ যে এই কনস্ট্রাক্ট ব্যবহারের জন্য)

privateসম্পত্তি হিসাবে যতক্ষণ না যায়, তারা কোনও ধরণের ওভাররেটেড হয় যদি না আপনি কোনও পাবলিক ফ্রেমওয়ার্ক বা লাইব্রেরি তৈরি করেন তবে আপনার যদি এগুলি প্রয়োগ করার প্রয়োজন হয় তবে ডগলাস ক্রকফোর্ডের কিছু ভাল ধারণা রয়েছে।


8
কঠোর মোড অন্তর্ভুক্ত গ্লোবালগুলি থেকে রক্ষা করে। এটি একটি স্বতঃ-চালকের সাথে একসাথে আপনি coveredেকে রাখবেন। আমি ব্যক্তিগত সম্পত্তি সম্পর্কে হুপলাহকে কখনই বুঝতে পারি নি। একটি ফানক কনস্ট্রাক্টরের ভিতরে vars ঘোষণা করুন। সম্পন্ন. রাতে 'নতুন' কীওয়ার্ডটি ব্যবহার করতে ভুলে যাওয়ার চিন্তা যদি আপনাকে ধরে রাখে তবে একটি কারখানার ফাংশন লিখুন। আবার হয়েছে।
এরিক পুনরায়

8

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

  1. আরও ভাল নেমস্পেস পরিচালনা (নেমস্পেস দূষণ এড়ানো -> জেএস মডিউল)
  2. সমাপ্তি (বেসরকারী শ্রেণীর সদস্যদের সিমুলেট করে, ওওপি থেকে পরিচিত হিসাবে পরিচিত)

প্রথমটি খুব ভালভাবে ব্যাখ্যা করা হয়েছে। দ্বিতীয়টির জন্য, দয়া করে নিম্নলিখিত উদাহরণটি অধ্যয়ন করুন:

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, সুতরাং কনভেনশন দ্বারা এটি মূলধন করা উচিত নয়।


7

কোনও প্যারামিটার আছে এবং "গুচ্ছের কোড" কোনও ফাংশন দেয়?

var a = function(x) { return function() { document.write(x); } }(something);

বন্ধ। somethingনির্ধারিত ফাংশনটির দ্বারা ব্যবহৃত মান asomethingকিছুটা পৃথক মান (লুপের জন্য) থাকতে পারে এবং প্রতিটি সময় একটি নতুন ফাংশন থাকে।


+1 টি; আমি প্যারামিটার হিসাবে var x = something;বাহ্যিক ক্রিয়াকলাপে একটি স্পষ্টতাকে পছন্দ করি x, যদিও: ইমো এটি এইভাবে আরও পঠনযোগ্য ...
ক্রিস্টোফ

@ ক্রিসটফ: ফাংশনটি তৈরি হওয়ার পরে যদি "কিছু" এর মান পরিবর্তন হয় তবে এটি তৈরির সময় নতুন মানটি ব্যবহার করবে না বরং এটির জন্য।
স্টেচ

@ স্টেস্ট: আপনি এটি কোথা থেকে পেয়েছেন? আমি যতদূর জানি, এটি ঘটনা নয়; জেএসে আসল রেফারেন্স পাওয়ার একমাত্র উপায় হ'ল আর্গুমেন্ট-অবজেক্ট ব্যবহার করা, তবে এটি সমস্ত ব্রাউজারে কাজ করে না
ক্রিস্টোফ

@ ক্রিসটফ: "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস", ডগলাস ক্রকফোর্ড (ও'রেলি)
স্টেচ

@ স্টেচ: এটি আপনার বর্ণনার মতো কাজ করে না: আপনি যদি পরিবর্তনশীলটিকে ফেলে xরাখেন এবং সরাসরি লেক্সিকাল স্কোপেসের উপর নির্ভর করেন তবে নতুন মান ব্যবহৃত হবে document.write(something)...
ক্রিস্টোফ

6

ব্যাপ্তি বিচ্ছিন্নতা, হতে পারে। যাতে ফাংশন ঘোষণার ভিতরে ভেরিয়েবলগুলি বাইরের নেমস্পেসকে দূষিত না করে।

অবশ্যই, সেখানে অর্ধেক জেএস বাস্তবায়ন, তারা যাইহোক।


4
এগুলি কী বাস্তবায়ন হবে?
ম্যাথু ক্রামলে

1
কঠোর মোডে লিখিত না থাকা এবং প্রয়োগ এবং অন্তর্ভুক্ত বিভিন্ন ঘোষণাপত্রের কোনও বাস্তবায়ন যা এটি বিশ্বব্যাপী হতে থাকে।
এরিক পুনরায়

5

একটি স্বতঃপ্রণোদিত বেনামী ফাংশন কীভাবে কার্যকর হতে পারে তার একটি দৃ 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প্রথম ক্ষেত্রে ঠিক হয়ে যাবে।
ভাইটালি জাদানেভিচ

3

একটি পার্থক্য হ'ল আপনি ফাংশনে যে ভেরিয়েবলগুলি ঘোষণা করেন তা স্থানীয়, সুতরাং আপনি যখন ফাংশন থেকে প্রস্থান করেন এবং অন্য কোডের অন্যান্য ভেরিয়েবলগুলির সাথে দ্বন্দ্ব না করেন তখন সেগুলি চলে যায়।


1

যেহেতু জাভাস্ক্রিপ্টে ফাংশনগুলি প্রথম শ্রেণীর অবজেক্ট, সেভাবে এটি সংজ্ঞায়িত করে, এটি কার্যকরভাবে সি ++ বা সি # এর মতো একটি "শ্রেণি" সংজ্ঞায়িত করে।

এই ফাংশনটি স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারে এবং এর মধ্যে ফাংশন থাকতে পারে। অভ্যন্তরীণ ফাংশনগুলি (কার্যকরভাবে উদাহরণ পদ্ধতিগুলি) স্থানীয় ভেরিয়েবলগুলিতে অ্যাক্সেস করতে পারে (কার্যকরভাবে ভেরিয়েবলগুলি) তবে এগুলি স্ক্রিপ্টের বাকী অংশ থেকে পৃথক করা হবে।


1

জাভাস্ক্রিপ্টে স্ব-স্বাক্ষরিত ফাংশন:

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


1

ভেরিয়েবলের স্কোপ পরিচালনা করতে স্ব-সম্পাদনকারী কার্য ব্যবহৃত হয়।

একটি ভেরিয়েবলের সুযোগ হ'ল আপনার প্রোগ্রামের অঞ্চলটি যেখানে এটি সংজ্ঞায়িত করা হয়।

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

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

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

সুতরাং মূলত একটি স্ব সম্পাদনকারী ক্রিয়াকলাপ জাভাস্ক্রিপ্ট কোডের অন্যান্য ব্লকে কীভাবে ভেরিয়েবলের নামকরণ করা হয়েছে তা উদ্বেগ ছাড়াই কোড লেখার অনুমতি দেয়।


1
(function(){
    var foo = {
        name: 'bob'
    };
    console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error

প্রকৃতপক্ষে, উপরের ফাংশনটি নাম ছাড়াই ফাংশন এক্সপ্রেশন হিসাবে বিবেচনা করা হবে।

ঘনিষ্ঠ এবং উন্মুক্ত বন্ধনী দিয়ে কোনও ফাংশন মোড়ানোর মূল উদ্দেশ্য হ'ল বৈশ্বিক স্থানকে দূষিত করা এড়ানো।

ফাংশন এক্সপ্রেশন ভিতরে ভেরিয়েবল এবং ফাংশন ব্যক্তিগত হয়ে উঠেছে (অর্থাত্) তারা ফাংশনের বাইরে উপলব্ধ হবে না।


1

সংক্ষিপ্ত উত্তর হ'ল: গ্লোবাল (বা উচ্চতর) সুযোগের দূষণ রোধ করা।

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

এটি আইআইএফই এক্সপ্রেশন লেখার অন্য উপায়। আমি ব্যক্তিগতভাবে এই নিম্নলিখিত পদ্ধতিটি পছন্দ করি:

void function() {
  console.log('boo!');
  // expected output: "boo!"
}();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void

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


ভাল, আমি voidআগে এর ব্যবহার দেখিনি । আমি এটা পছন্দ করি.
এজে।

1

প্রথমে আপনাকে অবশ্যই MDN IIFE দেখতে হবে , এখন এই সম্পর্কে কয়েকটি পয়েন্ট points

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

0

দেখে মনে হচ্ছে এই প্রশ্নের উত্তর প্রস্তুত হয়ে গেছে তবে আমি আমার ইনপুট যাইহোক পোস্ট করব।

আমি জানি যখন আমি স্ব-কার্যকরকারী কার্যাদি ব্যবহার করতে চাই।

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

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

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

সাধারণভাবে কোডিংয়ের একই জিনিসগুলি প্রচুর করার জন্য অনেক অস্পষ্ট উপায় রয়েছে যা আপনাকে অবাক করে তোলে, "কেন বিরক্ত করবেন?" তবে নতুন পরিস্থিতি পপ আপ করে রাখে যেখানে আপনি আর বেসিক / কোর প্রিন্সিপালের উপর নির্ভর করতে পারবেন না।


0

আপনার সাধারণ প্রশ্নটি দেওয়া: "জাভাস্ক্রিপ্টে আপনি কখন এটি ব্যবহার করতে চান: ..."

আমি @ একন_ব্রাউনিং এবং @ শন_হোল্ডিংয়ের উত্তরগুলি পছন্দ করি তবে এখানে আরও একটি ব্যবহার-মামলা রয়েছে যা আমি উল্লেখ করি না:

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

যেখানে নোড ইন্ডিট্রেট কিছু অ্যাসিনক্রোনাস অ্যাকশন।

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


-3

আইআইআরসি এটি আপনাকে ব্যক্তিগত সম্পত্তি এবং পদ্ধতিগুলি তৈরি করতে দেয়।

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