!function () {}();
!function () {}();
উত্তর:
জাভাস্ক্রিপ্ট সিনট্যাক্স 101. এখানে একটি ফাংশন ঘোষণা :
function foo() {}
দ্রষ্টব্য যে কোনও অর্ধবৃত্ত নেই: এটি কেবল একটি কার্যকারণ ঘোষণা । আপনার একটি অনুরোধের প্রয়োজন হবে,foo()
ফাংশনটি চালানোর জন্য আপনাকে ।
এখন, যখন আমরা আপাতদৃষ্টিতে নিরীহ বিস্ময়বোধক চিহ্নটি যুক্ত করব: !function foo() {}
এটি এটিকে একটি অভিব্যক্তিতে রূপান্তরিত করে । এটি এখন একটি ফাংশন এক্সপ্রেশন ।
!
একা অবশ্যই, ফাংশন ডাকা না, কিন্তু আমরা এখন লাগাতে পারেন ()
শেষে: !function foo() {}()
যা বেশী প্রাধান্য রয়েছে !
এবং সঙ্গে সঙ্গে ফাংশন কল।
সুতরাং লেখক যা করছেন তা ফাংশন এক্সপ্রেশন প্রতি বাইট সংরক্ষণ করছে; এটি লেখার আরও পঠনযোগ্য উপায় হ'ল:
(function(){})();
শেষ অবধি, !
অভিব্যক্তিটিকে সত্য করে তোলে। এটি কারণ ডিফল্টরূপে সমস্ত আইআইএফই রিটার্ন undefined
, যা আমাদের সাথে !undefined
থাকে true
। বিশেষভাবে দরকারী নয়।
!
বুলিয়ান রিটার্ন করে, আমরা সবাই তা জানি, তবে আপনি যে দুর্দান্ত পয়েন্টটি করেন তা হ'ল এটি ফাংশন ডিক্লেয়ারেশন স্টেটমেন্টকে একটি ফাংশন এক্সপ্রেশনে রূপান্তরিত করে যাতে ফাংশনটি তত্ক্ষণাত বন্ধনীগুলিতে মোড়ানো না করে অনুরোধ করা যায়। সুস্পষ্ট নয়, এবং পরিষ্কারভাবে কোডারের উদ্দেশ্য।
var foo =
বিবৃতি / অভিব্যক্তি অস্পষ্টতা ভঙ্গ করে এবং আপনি সহজভাবে লিখতে পারেন var foo = function(bar){}("baz");
ইত্যাদি
কাজ:
function () {}
কিছুই (বা অপরিবর্তিত) প্রদান করে না।
কখনও কখনও আমরা কোনও ফাংশনটি তৈরি করার সাথে সাথে কল করতে চাই। আপনি এটি চেষ্টা করতে প্রলুব্ধ হতে পারে:
function () {}()
কিন্তু এটি একটি ফলাফল SyntaxError
।
!
ক্রিয়াকলাপের আগে অপারেটরটি ব্যবহার করা এটিকে অভিব্যক্তি হিসাবে বিবেচনা করে, তাই আমরা এটি কল করতে পারি:
!function () {}()
এটি ফাংশনের রিটার্ন মানের বিপরীতে বুলিয়ানও ফিরিয়ে দেবে true
, কারণ !undefined
এটি true
। যদি আপনি চান যে আসল রিটার্ন মানটি কলটির ফলাফল হতে পারে, তবে এটি এইভাবে করার চেষ্টা করুন:
(function () {})()
!
হ'ল ফাংশন ঘোষণাকে একটি ফাংশন এক্সপ্রেশনে পরিণত করা, এগুলিই।
!function
সিনট্যাক্সটি ব্যবহার করে
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*/}()
বিবৃতিটি মিথ্যা হিসাবে মূল্যায়ন করতে পারে কিনা তা ফিরিয়ে দেয়। উদাহরণ:
!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
var myVar = !function(){ return false; }()
পছন্দটি বাদ দিতে !
পারে var myVar = function(){ return false; }()
এবং ফাংশনটি সঠিকভাবে কার্যকর হবে এবং প্রত্যাবর্তনের মানটি অচ্ছুত হবে।
true
সাথে !0
এবং এর false
সাথে প্রতিস্থাপন করতে চাই !1
। এটি 2 বা 3 টি অক্ষর সংরক্ষণ করে।
এটি যখন আমরা জাভাস্ক্রিপ্ট মিনিফিকেশন করি তখন কেবলমাত্র একটি বাইট ডেটা সংরক্ষণ করা।
নীচের বেনামে ফাংশন বিবেচনা করুন
function (){}
উপরেরগুলিকে স্ব-আমন্ত্রণমূলক ক্রিয়া হিসাবে তৈরি করতে আমরা সাধারণত উপরের কোডটিকে পরিবর্তন করব change
(function (){}())
এখন আমরা ফাংশনটির শেষে (,)
যোগ ()
করার পরিবর্তে দুটি অতিরিক্ত অক্ষর যুক্ত করেছি যা ফাংশনটি কল করার জন্য প্রয়োজনীয়। সংশোধন প্রক্রিয়াতে আমরা সাধারণত ফাইলের আকার হ্রাস করতে ফোকাস করি। সুতরাং আমরা উপরের ফাংশন হিসাবে লিখতে পারেন
!function (){}()
তবু উভয়ই স্ব-চলনকারী ফাংশন এবং আমরা একটি বাইটও সংরক্ষণ করি। 2 টি অক্ষরের পরিবর্তে (,)
আমরা কেবল একটি অক্ষর ব্যবহার করেছি!
! এটি একটি লজিকাল নট অপারেটর, এটি একটি বুলিয়ান অপারেটর যা এর বিপরীতে কোনও কিছুকে উল্টে দেয়।
যদিও আপনি ফাংশনের আগে ব্যাং (!) ব্যবহার করে অনুরোধ করা ফাংশনটির প্রথম বন্ধনীগুলি বাইপাস করতে পারেন , এটি এখনও রিটার্নটিকে উল্টে দেবে, যা আপনি যা চেয়েছিলেন তা নাও হতে পারে। একটি 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
বিস্মৃত চিহ্নটি যে কোনও ক্রিয়াকলাপটিকে সর্বদা একটি বুলিয়ান ফিরিয়ে দেয়।
চূড়ান্ত মান হ'ল ফাংশন দ্বারা প্রত্যাবর্তিত মান অবহেলা।
!function bool() { return false; }() // true
!function bool() { return true; }() // false
ছেড়ে যাওয়া হচ্ছে !
উপরের উদাহরণগুলোতে একটি হবে বাক্যগঠনের ত্রুটি ।
function bool() { return true; }() // SyntaxError
তবে এটি অর্জনের আরও ভাল উপায় হ'ল:
(function bool() { return true; })() // true
!
রানটাইম ফাংশনটিকে বিশ্লেষণের উপায়কে পরিবর্তন করে। এটি রানটাইমের সাথে ফাংশনটিকে ফাংশন এক্সপ্রেশন হিসাবে ঘোষণা করে (এবং কোনও ঘোষণা নয়)। এটি এটি বিকাশকারীকে অবিলম্বে ()
বাক্য গঠন ব্যবহার করে ফাংশনটি শুরু করতে সক্ষম করতে সক্ষম করে । !
এছাড়াও ফাংশন এক্সপ্রেশন চাওয়া ফলাফল নিজেকে (অর্থাত্ উপেক্ষা) প্রয়োগ করা হবে।
এটি আইআইএফই লেখার আর একটি উপায় (অবিলম্বে অনুরোধ করা ফাংশন এক্সপ্রেশন)।
এটির লেখার অন্য উপায় -
(function( args ) {})()
একই রকম
!function ( args ) {}();
(function (args) {...})()
বাক্য !function
গঠনটি কঠোরভাবে পছন্দ করতাম এবং সেই ফর্মটি মিনিফিকেশন এবং অবলম্বন সরঞ্জামগুলিতে ছেড়ে যাই।
!
ফলস্বরূপ আপনি যা প্রত্যাশা করছেন তা প্রত্যাখ্যান করবে (যেমন) যদি আপনার কাছে থাকে
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