বিস্ময়বোধক চিহ্নটি ফাংশনের আগে কী করে?


1242
!function () {}();

4
: @Dykam তার উপযোগিতা এই উত্তর ব্যাখ্যা করা হয় stackoverflow.com/questions/5422585/...
hectorct



7
এটিকে অবিলম্বে আমন্ত্রণযুক্ত ফাংশন এক্সপ্রেশন হিসাবে উল্লেখ করার জন্য @ বেফজ বেটার আরও ভাল, যেহেতু এই নিবন্ধটি পরে ব্যাখ্যা করেছে ("স্ব-কার্যকরকারী" পুনরাবৃত্তি বোঝায়)
জ্যাচ এস্পোসিতো

উত্তর:


2116

জাভাস্ক্রিপ্ট সিনট্যাক্স 101. এখানে একটি ফাংশন ঘোষণা :

function foo() {}

দ্রষ্টব্য যে কোনও অর্ধবৃত্ত নেই: এটি কেবল একটি কার্যকারণ ঘোষণা । আপনার একটি অনুরোধের প্রয়োজন হবে,foo()ফাংশনটি চালানোর জন্য আপনাকে ।

এখন, যখন আমরা আপাতদৃষ্টিতে নিরীহ বিস্ময়বোধক চিহ্নটি যুক্ত করব: !function foo() {}এটি এটিকে একটি অভিব্যক্তিতে রূপান্তরিত করে । এটি এখন একটি ফাংশন এক্সপ্রেশন

!একা অবশ্যই, ফাংশন ডাকা না, কিন্তু আমরা এখন লাগাতে পারেন ()শেষে: !function foo() {}()যা বেশী প্রাধান্য রয়েছে !এবং সঙ্গে সঙ্গে ফাংশন কল।

সুতরাং লেখক যা করছেন তা ফাংশন এক্সপ্রেশন প্রতি বাইট সংরক্ষণ করছে; এটি লেখার আরও পঠনযোগ্য উপায় হ'ল:

(function(){})();

শেষ অবধি, !অভিব্যক্তিটিকে সত্য করে তোলে। এটি কারণ ডিফল্টরূপে সমস্ত আইআইএফই রিটার্ন undefined, যা আমাদের সাথে !undefinedথাকে true। বিশেষভাবে দরকারী নয়।


229
+1 টি। এটি সত্যিই এখানে সেরা উত্তর, এবং দুঃখের বিষয়, খুব কমই উত্সাহ দেওয়া হয়েছে। স্পষ্টতই, !বুলিয়ান রিটার্ন করে, আমরা সবাই তা জানি, তবে আপনি যে দুর্দান্ত পয়েন্টটি করেন তা হ'ল এটি ফাংশন ডিক্লেয়ারেশন স্টেটমেন্টকে একটি ফাংশন এক্সপ্রেশনে রূপান্তরিত করে যাতে ফাংশনটি তত্ক্ষণাত বন্ধনীগুলিতে মোড়ানো না করে অনুরোধ করা যায়। সুস্পষ্ট নয়, এবং পরিষ্কারভাবে কোডারের উদ্দেশ্য।
gille3

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

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

5
@ কার্নিক্স var foo =বিবৃতি / অভিব্যক্তি অস্পষ্টতা ভঙ্গ করে এবং আপনি সহজভাবে লিখতে পারেন var foo = function(bar){}("baz");ইত্যাদি
নীল

6
এটি সাধারণত মিনিফিকেশন / অগ্লিফিকেশন স্ক্রিপ্ট দ্বারা করা হয়, যেখানে প্রতিটি একক বাইট গণনা করা হয়।
ডিমা স্লুইন

367

কাজ:

function () {}

কিছুই (বা অপরিবর্তিত) প্রদান করে না।

কখনও কখনও আমরা কোনও ফাংশনটি তৈরি করার সাথে সাথে কল করতে চাই। আপনি এটি চেষ্টা করতে প্রলুব্ধ হতে পারে:

function () {}()

কিন্তু এটি একটি ফলাফল SyntaxError

!ক্রিয়াকলাপের আগে অপারেটরটি ব্যবহার করা এটিকে অভিব্যক্তি হিসাবে বিবেচনা করে, তাই আমরা এটি কল করতে পারি:

!function () {}()

এটি ফাংশনের রিটার্ন মানের বিপরীতে বুলিয়ানও ফিরিয়ে দেবে true, কারণ !undefinedএটি true। যদি আপনি চান যে আসল রিটার্ন মানটি কলটির ফলাফল হতে পারে, তবে এটি এইভাবে করার চেষ্টা করুন:

(function () {})()

28
কে এই প্রয়োজন হতে পারে?
অ্যান্ড্রে

13
এই একমাত্র উত্তর যা প্রশ্নের ক্ষেত্রে ব্যাখ্যা করে, ব্র্যাভো!
অ্যান্ড্রে

14
আপনার দ্বিতীয় কোড নমুনা বৈধ জাভাস্ক্রিপ্ট নয়। এর উদ্দেশ্য !হ'ল ফাংশন ঘোষণাকে একটি ফাংশন এক্সপ্রেশনে পরিণত করা, এগুলিই।
স্কিলড্রিক

8
@ অ্যান্ড্রে বুটস্ট্র্যাপ টুইটারটি এটি সমস্ত জাভাস্ক্রিপ্ট (jQuery) প্লাগইন ফাইলগুলিতে ব্যবহার করে। অন্যদের মধ্যেও একই প্রশ্ন থাকতে পারে এই মন্তব্যটি যুক্ত করা।
আনমল সারাফ

2
d3.js এছাড়াও !functionসিনট্যাক্সটি ব্যবহার করে
ক্রিশ্চিয়ান

65

Airbnb জাভাস্ক্রিপ্ট গাইড! চিহ্নিত ফাংশন অনুরোধ জন্য ব্যবহার করার জন্য একটি ভাল পয়েন্ট আছে

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

!function abc(){}();
!function bca(){}();

যেমন কাজ করবে

!function abc(){}();
(function bca(){})();

তবে একটি চরিত্র সংরক্ষণ করে এবং স্বেচ্ছাচারিতা আরও ভাল দেখায়।

আর উপায় কোন দ্বারা +, -, ~, voidঅপারেটার একই প্রভাব, ফাংশন invoking, নিশ্চিত পরিপ্রেক্ষিতে আপনি যে ফাংশন তারা ভিন্নভাবে কাজ করবে থেকে ফিরে কিছু ব্যবহার করতে হবে যদি না।

abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?

তবে আপনি যদি কোনও ফাইলের জন্য আইআইএফই নিদর্শনগুলি ব্যবহার করেন তবে একটি মডিউল কোড পৃথককরণ এবং অপ্টিমাইজেশনের জন্য কনক্যাট সরঞ্জাম ব্যবহার করা (যা এক লাইনে একটি ফাইল কাজ করে), তবে নির্মাণ

!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()

নিরাপদ কোড সম্পাদন করবে, খুব প্রথম কোডের নমুনার মতো।

এটি জাভাস্ক্রিপ্ট এএসআই এর কাজ করতে সক্ষম হবে না বলে ত্রুটি ছুঁড়ে দেবে।

!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()

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

এইটা কাজ করে:

!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()

এটি নয়:

^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()

3
আসলে, অন্যান্য চিহ্নগুলির একই প্রভাব নেই। হ্যাঁ, তারা বর্ণিত হিসাবে আপনাকে কোনও ফাংশন কল করার অনুমতি দেয় তবে তারা অভিন্ন নয়। বিবেচনা করুন: var foo =! ফাংশন (বার) so কনসোল.দেবগ (বার); } ( "ব্যাট"); আপনার কোন প্রতীক আপনি সামনে রেখেছেন তা বিবেচ্য নয়, আপনি আপনার কনসোলে "ব্যাট" পান। এখন, কনসোল.দেবগ যুক্ত করুন ("foo:", foo); - আপনি কোন চিহ্ন ব্যবহার করেন তার উপর ভিত্তি করে আপনি খুব আলাদা ফলাফল পান। ! একটি রিটার্ন মান জোর করে যা সর্বদা কাম্য নয়। আমি স্পষ্টতা এবং নির্ভুলতার জন্য ({}) () সিনট্যাক্সটিকে পছন্দ করি।
কার্নিক্স

29

বিবৃতিটি মিথ্যা হিসাবে মূল্যায়ন করতে পারে কিনা তা ফিরিয়ে দেয়। উদাহরণ:

!false      // true
!true       // false
!isValid()  // is not valid

আপনি বুলিয়ান একটি মান বাধ্য করতে এটি দুবার ব্যবহার করতে পারেন:

!!1    // true
!!0    // false

সুতরাং, আপনার প্রশ্নের আরও সরাসরি উত্তর দিতে:

var myVar = !function(){ return false; }();  // myVar contains true

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

function () { return false; }();  // syntax error

6
পাঠকদের স্পষ্টতার স্বার্থে যারা তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন সহ কোনও অ্যাসাইনমেন্ট ব্যবহার করতে চাইতে পারে আপনার উদাহরণ কোডটি var myVar = !function(){ return false; }()পছন্দটি বাদ দিতে !পারে var myVar = function(){ return false; }()এবং ফাংশনটি সঠিকভাবে কার্যকর হবে এবং প্রত্যাবর্তনের মানটি অচ্ছুত হবে।
মার্ক ফক্স

1
স্পষ্টতই, আপনি এটি বুলিয়ানকে জোর করে একবার ব্যবহার করতে পারেন, কারণ এটি যৌক্তিক নয় অপারেটর। ! 0 = সত্য এবং 1 = মিথ্যা। জাভাস্ক্রিপ্ট মিনিফিকেশন উদ্দেশ্যে, আপনি trueসাথে !0এবং এর falseসাথে প্রতিস্থাপন করতে চাই !1। এটি 2 বা 3 টি অক্ষর সংরক্ষণ করে।
ট্রাইঙ্কো

9

এটি যখন আমরা জাভাস্ক্রিপ্ট মিনিফিকেশন করি তখন কেবলমাত্র একটি বাইট ডেটা সংরক্ষণ করা।

নীচের বেনামে ফাংশন বিবেচনা করুন

function (){}

উপরেরগুলিকে স্ব-আমন্ত্রণমূলক ক্রিয়া হিসাবে তৈরি করতে আমরা সাধারণত উপরের কোডটিকে পরিবর্তন করব change

(function (){}())

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

!function (){}()

তবু উভয়ই স্ব-চলনকারী ফাংশন এবং আমরা একটি বাইটও সংরক্ষণ করি। 2 টি অক্ষরের পরিবর্তে (,)আমরা কেবল একটি অক্ষর ব্যবহার করেছি!


1
এটি সহায়ক কারণ প্রায়শই আপনি এটি minified js এ দেখতে পাবেন
নামের জন্য

5

! এটি একটি লজিকাল নট অপারেটর, এটি একটি বুলিয়ান অপারেটর যা এর বিপরীতে কোনও কিছুকে উল্টে দেয়।

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

পরিবর্তে, প্রয়োজন হলে ক্লোজিং বন্ধনী এবং ব্যাং ( ! ) ব্যবহার করুন ।

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

অন্যান্য অপারেটররা কাজ করে ...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

সম্মিলিত অপারেটর ...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1

5

বিস্মৃত চিহ্নটি যে কোনও ক্রিয়াকলাপটিকে সর্বদা একটি বুলিয়ান ফিরিয়ে দেয়।
চূড়ান্ত মান হ'ল ফাংশন দ্বারা প্রত্যাবর্তিত মান অবহেলা।

!function bool() { return false; }() // true
!function bool() { return true; }() // false

ছেড়ে যাওয়া হচ্ছে !উপরের উদাহরণগুলোতে একটি হবে বাক্যগঠনের ত্রুটি

function bool() { return true; }() // SyntaxError

তবে এটি অর্জনের আরও ভাল উপায় হ'ল:

(function bool() { return true; })() // true

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

3

এটি আইআইএফই লেখার আর একটি উপায় (অবিলম্বে অনুরোধ করা ফাংশন এক্সপ্রেশন)।

এটির লেখার অন্য উপায় -

(function( args ) {})()

একই রকম

!function ( args ) {}();

ঠিক আছে, এটি ঠিক এক রকম নয়; ২ য় ফর্মটি ফাংশন কলের ফলাফলটিকে অগ্রাহ্য করে (এবং তারপরে এটিকে ছুঁড়ে ফেলে দেয়, কারণ কোনও মান অ্যাসাইনমেন্ট নেই)। আমি আরও সুস্পষ্ট (function (args) {...})()বাক্য !functionগঠনটি কঠোরভাবে পছন্দ করতাম এবং সেই ফর্মটি মিনিফিকেশন এবং অবলম্বন সরঞ্জামগুলিতে ছেড়ে যাই।
টোবিয়াস

-1

! ফলস্বরূপ আপনি যা প্রত্যাশা করছেন তা প্রত্যাখ্যান করবে (যেমন) যদি আপনার কাছে থাকে

var boy = true;
undefined
boy
true
!boy
false

আপনি কল যখন boy, আপনার ফল কী হবে true, কিন্তু মুহূর্ত আপনি যোগ !যখন কলিং boy, অর্থাত্ !boy, আপনার ফল কী হবে false। যা অন্য কথায় আপনি নোটবয় বোঝাচ্ছেন তবে এবার এটি মূলত বুলিয়ান ফলাফল, হয় হয় trueবা হয়false

এটি একই জিনিসটি যা !function () {}();অভিব্যক্তির সাথে ঘটে থাকে তা কেবল function () {}();চালানোই আপনাকে একটি ত্রুটি হিসাবে চিহ্নিত করবে, তবে !আপনার function () {}();অভিব্যক্তির সামনের অংশটি যুক্ত করে, এটি function () {}();আপনাকে ফিরিয়ে আনার বিপরীতে পরিণত করে true। উদাহরণ নীচে দেখা যাবে:

function () {}();
SyntaxError: function statement requires a name
!function () {}();
true
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.