জাভাস্ক্রিপ্ট ফাংশন নেতৃস্থানীয় ঠুং! বাক্য গঠন


204

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

!function(){
  // do stuff
}();

আরও সাধারণ বিকল্প হিসাবে

(function(){
  // do stuff
})();

বেনামী ফাংশন স্ব স্ব জন্য।

আমি কিছু জিনিস ভাবছি। প্রথমে, শীর্ষের উদাহরণটি আসলে কাজ করার অনুমতি দিচ্ছে কি? এই বিবৃতিটি সিনট্যাক্টিক্যালি সঠিক করার জন্য কেন ব্যাং প্রয়োজনীয়? আমাকে সে সম্পর্কেও জানানো হয়েছে যে এটি +কাজ করে এবং আমি নিশ্চিত যে এর জায়গায় অন্য কেউ রয়েছেন!

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

কেবলমাত্র অন্য পার্থক্যটি আমি দেখতে পাচ্ছি স্ব-আমন্ত্রণমূলক ফাংশনের রিটার্ন মান, তবে এই দুটি উদাহরণে আমরা ফাংশনটির রিটার্ন ভ্যালু সম্পর্কে সত্যিই চিন্তা করি না কারণ এটি কেবলমাত্র বন্ধ করার জন্য ব্যবহৃত হয়। তাহলে কেউ আমাকে বলতে পারেন যে কেউ কেন প্রথম সিনট্যাক্স ব্যবহার করতে পারে?


ফ্রেমওয়ার্কগুলি যতটা অক্ষর পারে সেগুলি সংরক্ষণ করতে পছন্দ করে যে কোনও মিনিফায়ার অনুকূল করতে পারে না।
অ্যালেক্স

প্রথম উপকারটি আমার মাথায় আসে আপনি স্যান্ডবক্স তৈরি করতে পারেন, (ফাংশন ($) {...}) (jQuery);
জেএস টেলর

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

8
আমি এটি পূর্বের ক্রুর তুলনায় আরও পরিশীলিতভাবে এমনভাবে সুন্দর হওয়ার প্রয়োজনের, নী, প্রয়োজনকে দায়ী করি। "ওহ, এই পিতৃতান্ত্রিক হাইথেনস, আমরা পেয়েছি !!"
জারেড ফারিশ

2
আমি এই সম্পর্কে কখনই জানতাম না, দুর্দান্ত। আমি !এটি কার্যকর করার মত জোর দেয় হিসাবে পছন্দ করি ।
সিডিএমকেই

উত্তর:


97

আদর্শভাবে আপনার এই সমস্ত সহজভাবে করতে সক্ষম হওয়া উচিত:

function(){
  // do stuff
}(); 

এর অর্থ বেনামে ফাংশন ঘোষণা করুন এবং এটি সম্পাদন করুন। তবে এটি জেএস ব্যাকরণের নির্দিষ্টকরণের কারণে কাজ করবে না।

এটি অর্জনের খুব সংক্ষিপ্ততম রূপটি হ'ল কিছু এক্সপ্রেশন যেমন ইউনারিএক্সপ্রেশন (এবং তাই কলএক্সপ্রেসন) ব্যবহার করা:

!function(){
  // do stuff
}(); 

বা মজাদার জন্য:

-function(){
  // do stuff
}(); 

বা:

+function(){
  // do stuff
}(); 

অথবা এমনকি:

~function(){
  // do stuff
  return 0;
}( );

3
তাহলে কি একমাত্র উপকার হবে?
ব্র্যাড

12
আমি উপরের সমস্ত বিকল্পগুলি এখানে পারফরম্যান্স পরীক্ষায় যুক্ত করেছি: jsperf.com/bang-function
Shaz

5
ভাববাদী আমি বলব। একবারে চালিত হওয়ার সাথে সাথে গতি প্রকৃতপক্ষে কিছু যায় আসে না।
সি-হাসি

1
কৌতূহলের বাইরে, আমি লক্ষ্য করেছি যে কোনও ঠুং ঠুং শব্দ দ্রুততম সঞ্চালন করে না তবে কোথাও ক্রোমের বিবর্তনে কমপক্ষে, ব্যাং কোনও ব্যাংয়ের চেয়ে দ্রুত হয়ে উঠেছে। (সম্ভবত পরিসংখ্যানগত দিক থেকে তুচ্ছ তবে ...) এর কোনও কারণ আছে কি? আমি হুডের নীচে কোড সম্পর্কে বেশি কিছু জানি না তবে এটি বেশ আকর্ষণীয় বলে মনে করি।
jmk2142

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

73

জাভাস্ক্রিপ্টে, একটি রেখা দিয়ে শুরু functionকরা একটি ফাংশন বিবৃতি হিসাবে প্রত্যাশিত এবং এটির মতো দেখাবে বলে মনে করা হচ্ছে

function doSomething() {
}

একটি স্ব-চাওয়া ফাংশন মত

function(){
  // do stuff
}();

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

(function(){
  // do stuff
})();

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

আমি এই সম্মেলন সম্পর্কে অবগত ছিলাম না, তবে এটি সাধারণ হয়ে উঠলে এটি পাঠযোগ্যতায় অবদান রাখতে পারে। আমার অর্থ হ'ল যে কোনও !functionএকটি বড় ব্লকের কোডের শীর্ষে যে কেউ পড়ছেন সে একটি স্ব-আবেদনের প্রত্যাশা করবে, আমরা যখন দেখি তখনই আমরা যেভাবে ইতিমধ্যে একই অবস্থা আশা করব (function। বাদে আমরা সেই বিরক্তিকর বন্ধনীগুলি হারাব। গতি বা চরিত্রের গণনায় কোনও সঞ্চয়ের বিপরীতে আমি কারণটি আশা করব।


এই "ফাংশন দিয়ে শুরু লাইনটি প্রত্যাশিত ..." দেখতে বেশ ঝাপসা দেখাচ্ছে। এটি সম্পর্কে কী:var foo = {CR/LF here} function bar() {}
সি-হাসি

45

ইতিমধ্যে যা বলা হয়েছিল সেগুলি ছাড়া সিনট্যাক্সটিও! আপনি যদি সেমিকোলন ছাড়াই জাভাস্ক্রিপ্ট লেখেন তবে দরকারী:

var i = 1
!function(){
  console.log('ham')
}()

i = 2
(function(){
  console.log('cheese')
})()

প্রথম উদাহরণটি প্রত্যাশা অনুযায়ী 'হাম' আউটপুট করে তবে দ্বিতীয়টি ত্রুটি ছুঁড়ে দেয় কারণ নীচের বন্ধনীগুলির কারণে i = 2 বিবৃতিটি শেষ হয় নি।

পূর্ববর্তী কোডটিতে সেমিকোলনগুলি অনুপস্থিত থাকলে আপনার উদ্বেগের দরকার নেই জাভাস্ক্রিপ্ট ফাইলগুলিতে। সুতরাং সাধারণের প্রয়োজন নেই; (ফাংশন () {}) (); আপনার নিজের ব্রেক হবে না তা নিশ্চিত করার জন্য।

আমি জানি আমার উত্তরটি দেরিতে হলেও আমার মনে হয় এটি এখনও উল্লেখ করা হয়নি :)


6
টিপ এবং স্মৃতিগুলির জন্য +1 ... আজকাল কেউ সেমিকোলন ছাড়া জাভাস্ক্রিপ্ট লিখতে পছন্দ করে না।
পাবলো গ্রিসাফি

4
টুইটার বুটস্ট্র্যাপ সেমিকোলন ছাড়াই সমস্ত জেএস, এবং এটি বেশ নতুন ... (উপরের মন্তব্যটি যদি ব্যঙ্গাত্মক প্রকৃতির ছিল এবং আমি এটি মিস করি তবে)
ব্র্যান্ডউইফল

2
এটি আসলে সত্য নয়। নিম্নলিখিত উদাহরণটি বিবেচনা করুন:! আপনি একটি ত্রুটি পেয়েছেন: "সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত টোকেন!"
হেভিসিক্সার

হ্যাঁ তুমিই ঠিক. আপনি যদি একই লাইনে রাখেন তবে একটি ত্রুটি আছে। আমি সে সম্পর্কে ভেবে দেখিনি। তবে, আমি এখনও অবধি কোন কনক্রিটেশন স্ক্রিপ্ট / লিবিব ব্যবহার করে নি। এবং আপনি যখন মিনিফাইয়েড এবং কনক্যাট করেন তখন আপনার ফাইলগুলি সেমিকোলন যুক্ত হয়। সুতরাং, সত্যি বলতে, আমি এমন কোনও ক্ষেত্রে কল্পনা করতে পারি না যেখানে আপনি এই সমস্যায় পড়েছেন। অন্যদিকে, এখানে সকাল 2 টা এবং আমি অজ্ঞ হতে পারি :)
স্মু

6

একটি জিনিসের জন্য, জেএসফিউর দেখায় যে !(ইউনারিএক্সপ্রেসনের) ব্যবহারটি সাধারণত দ্রুত হয়। কখনও কখনও তারা সমান হয়ে আসে, কিন্তু যখন তারা না হয়, আমি এখনও অন্যদের তুলনায় নন-বেঞ্জড একটি বিজয় খুব বেশি দেখিনি : http://jsperf.com/bang-function

এটি সর্বশেষতম উবুন্টুতে পরীক্ষিত হয়েছিল (পুরানো প্রতি কথায় ..) ক্রোম, সংস্করণ 8। সুতরাং ফলাফল অবশ্যই পৃথক হতে পারে।

সম্পাদনা: কেমন পাগলের মতো delete?

delete function() {
   alert("Hi!"); 
}();

বা void?

void function() {
   alert("Hi!"); 
}();

মজাদার! আমি প্রায় 50/50 পেয়েছি যদিও সাফারি গতি অনুযায়ী, অ-ব্যান্ড অবশ্যই এর নিজস্ব ছিল। আমি ভাবছি সম্ভাব্য গতির পার্থক্যের কোনও তত্ত্ব আছে কিনা?
ব্র্যাড

@ ব্র্যাড অবশ্যই সাফারি করার জন্য কিছু হতে হবে, আপনি যদি পরীক্ষাগুলি দেখুন তবে অন্যান্য ব্রাউজারগুলির বেশিরভাগই পক্ষপাতী বলে মনে হচ্ছে !। তবে আমি
এটির

3
আমি শূন্যতা পছন্দ করি কারণ এটি স্পষ্টতই বলেছে যে "আমি ফেরতের মূল্যের বিষয়ে চিন্তা করি না", এবং কারণ এটি আমাকে অন্যান্য ভাষায় সম্মেলনের কথা মনে করিয়ে দেয়
কোড_মঙ্ক

4

আপনি এখানে দেখতে পারেন , জাভাস্ক্রিপ্টে স্ব-চালিত পদ্ধতিগুলি করার সর্বোত্তম উপায়টি হ'ল:

(function(){}()); -> 76,827,475 ops/sec

!function(){}();  -> 69,699,155 ops/sec

(function(){})(); -> 69,564,370 ops/sec

1
আমি সন্দেহ করি যে পারফরম্যান্সই একটি সিনট্যাক্স বা অন্যটি ব্যবহার করার কারণ। 70 এম অপস / সেকেন্ডে, বন্ধ
ঘোষণাটি

3

সুতরাং, "নিন!" এবং অন্যান্য সমস্ত অ্যানারি অপারেটর যেমন +, -, ~, মোছা, বাতিল, অনেক কিছুই বলা হয়েছে, কেবল সংক্ষেপে:

!function(){
  alert("Hi!");
}(); 

অথবা

void function(){
  alert("Hi!");
}();

অথবা

delete function(){
  alert("Hi!");
}();

এবং মজাদার জন্য বাইনারি অপারেটরগুলির সাথে আরও কয়েকটি কেস :)

1 > function() {
   alert("Hi!"); 
}();

অথবা

1 * function() {
   alert("Hi!"); 
}();

অথবা

1 >>> function() {
   alert("Hi!"); 
}();

অথবা এমনকি

1 == function() {
   alert("Hi!"); 
}();

অন্য কারও জন্য ত্রেনারি ছেড়ে দেওয়া :)


12
0?0:function() { alert("Hi!"); }();
daniel1426

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