javascript - لوحة - علامة تعجب واستفهام




ماذا تفعل علامة التعجب قبل الوظيفة؟ (6)

!function () {}();

الوظيفة:

function () {}

يعيد شيئا (أو غير معروف).

أحيانًا نرغب في استدعاء وظيفة بشكل صحيح أثناء إنشائها. قد تجرّب تجربة ذلك:

function () {}()

لكنه ينتج في SyntaxError .

باستخدام ! عامل ما قبل الدالة يؤدي إلى معاملته كتعبير ، حتى نتمكن من الاتصال به:

!function () {}()

سيعود هذا أيضًا بالعكس المنطقي لقيمة الإرجاع للدالة ، في هذه الحالة ، لأنه !undefined true . إذا كنت تريد أن تكون قيمة الإرجاع الفعلية هي نتيجة المكالمة ، فحاول أن تفعلها بهذه الطريقة:

(function () {})()

بناء جملة JavaScript 101. فيما يلي تعريف الدالة :

function foo() {}

لاحظ أنه لا يوجد فاصلة منقوطة: هذا مجرد إعلان دالة. ستحتاج إلى استدعاء ، foo() ، لتشغيل الوظيفة فعليًا.

الآن ، عندما نضيف علامة التعجب التي تبدو غير حميدة:! !function foo() {} يتحول إلى تعبير . هو الآن تعبير وظيفة .

! وحده لا يستدعي الوظيفة ، بالطبع ، لكن يمكننا الآن وضع () في النهاية !function foo() {}() التي لها أسبقية من ! ويدعو على الفور وظيفة.

إذن ما يفعله المؤلف هو حفظ تعبير لكل بايت دالة ؛ طريقة أكثر قابلية للقراءة للكتابة سيكون هذا:

(function(){})();

وأخيرا ، ! يجعل التعبير يعود صحيحًا. ويرجع ذلك إلى أن كل عودة IIFE undefined بشكل افتراضي ، الأمر الذي يتركنا مع !undefined والذي هو true . غير مفيد بشكل خاص.


طريقة أخرى لكتابة IIFE (تعبير الدالة المستدعى على الفور).

طريقة أخرى للكتابة -

(function( args ) {})()

مثل

!function ( args ) {}();

هناك نقطة جيدة لاستخدام ! للاحتجاج وظيفة وضعت علامة على دليل جافا سكريبت airbnb

عموما فكرة لاستخدام هذه التقنية على ملفات منفصلة (الملقب الوحدات) التي في وقت لاحق متسلسلة. التحذير هنا هو أن الملفات من المفترض أن تكون متسلسلة بالأدوات التي تضع ملفًا جديدًا في سطر جديد (وهو سلوك مشترك على أية حال لمعظم أدوات concat). في هذه الحالة باستخدام ! سيساعد على تجنب الخطأ في ما إذا كانت الوحدة النمطية المتسلسلة السابقة مفقودة ، ومع ذلك سيعطي المرونة لوضعها بأي ترتيب دون قلق.

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

ستعمل نفس

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

ولكن يحفظ حرفين ويظهر بشكل عشوائي.

وبالمناسبة ، فإن أي عامل من عوامل void + ، - ، ~ يكون له نفس التأثير ، من حيث وظيفة الاستدعاء ، وبالتأكيد إذا كنت تستخدم شيئًا للعودة من هذه الوظيفة ، فسيعملون بشكل مختلف.

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?

ولكن إذا كنت تستخدم أنماط IIFE لملف واحد واحد فصل رمز الوحدة النمطية واستخدام أداة concat للتحسين (مما يجعل وظيفة سطر واحد ملف واحد) ، من البناء

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

سيتم تنفيذ تعليمات برمجية آمنة ، مثل عينة شفرة أولى جدًا.

سيؤدي هذا الخطأ إلى حدوث خطأ لأن JavaScript ASI لن يتمكن من القيام بعمله.

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

ملاحظة واحدة بشأن المشغلين الأحاديين ، سيقومون بعمل مماثل ، ولكن فقط في حالة عدم استخدامهم في الوحدة الأولى. لذا فهم ليسوا آمنين إذا لم تكن لديك السيطرة الكاملة على أمر التسلسل.

هذا يعمل:

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

ليس هذا:

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

! سوف ينفي (عكس) ما كنت تتوقع نتيجة لذلك ، أي إذا كان لديك

var boy = true;
undefined
boy
true
!boy
false

عندما تتصل boy ، ستكون النتيجة true ، ولكن في اللحظة التي تضيف فيها ! عند الاتصال boy ، أي !boy ، ستكون النتيجة false . أي بمعنى آخر تقصد NotBoy ، ولكن هذه المرة هي في الأساس نتيجة منطقية ، إما true أو false .

هذا هو نفس الشيء الذي يحدث !function () {}(); التعبير ، تشغيل function () {}(); فقط function () {}(); سيبلغك عن خطأ ما ، لكن أضفه ! أمامك مباشرة function () {}(); التعبير ، يجعلها عكس function () {}(); والتي يجب أن تعيدك true . يمكن رؤية المثال أدناه:

function () {}();
SyntaxError: function statement requires a name
!function () {}();
true

! هو مشغل منطقي NOT ، إنه مشغل منطقي يقوم بعكس شيء إلى نقيضه.

على الرغم من أنه يمكنك تخطي الأقواس للدالة التي تم استدعاءها باستخدام BANG (!) قبل الوظيفة ، فإنها ستستمر في عكس العائد ، وهو ما قد لا يكون ما تريده. كما هو الحال في IEFE ، فإنه سيعود غير معروف ، والذي يصبح عندما يكون معكوس صحيحًا.

بدلاً من ذلك ، استخدم أقواس الإغلاق و BANG ( ! ) إذا لزم الأمر.

// 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