لماذا جافا سكريبت تحتاج إلى البدء مع ";"?
-
21-09-2019 - |
سؤال
لقد لاحظت في الآونة الأخيرة أن الكثير من جافا سكريبت الملفات على شبكة الإنترنت تبدأ مع ;
عقب قسم التعليق.
على سبيل المثال ، هذا مسج البرنامج المساعد رمز يبدأ مع:
/**
* jQuery.ScrollTo
* Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
* Dual licensed under MIT and GPL.
* Date: 9/11/2008
.... skipping several lines for brevity...
*
* @desc Scroll on both axes, to different values
* @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
*/
;(function( $ ){
لماذا الملف تحتاج أن تبدأ مع ;
?أرى أن هذه الاتفاقية من جانب الخادم ملفات جافا سكريبت كذلك.
ما هي مزايا وعيوب من فعل هذا ؟
المحلول
أود أن أقول نظرًا لأن البرامج النصية غالباً ما تكون متسلسلة ومُعجلة/مضغوطة/إرسالها معًا ، هناك فرصة أن يكون لدى الرجل الأخير شيئًا مثل:
return {
'var':'value'
}
في نهاية البرنامج النصي الأخير بدون أ ;
في النهايه. اذا كان لديك ;
في البداية ، إنه آمن ، مثال:
return {
'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)
return {
'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!
return {
'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm
نصائح أخرى
أعتقد (على الرغم من أنني لست متأكدًا ، لذا يرجى عدم الانقضاض علي) أن هذا سيضمن إغلاق أي بيان مسبق من ملف مختلف. في أسوأ الحالات ، سيكون هذا بيانًا فارغًا ، ولكن في أفضل الحالات ، قد يتجنب محاولة تعقب خطأ في هذا الملف عندما جاء البيان غير المكتملة بالفعل من أعلاه.
النظر في هذا المثال:
function a() {
/* this is my function a */
}
a()
(function() {
/* This is my closure */
})()
ما سيحدث هو أنه سيتم تقييم مثل هذا:
function a() {
/* this is my function a */
}
a()(function() {})()
لذلك ما من أي وقت مضى a
تعود سيتم التعامل مع وظيفة أحد حاول أن تكون تهيئة.
هذا هو الغالب لمنع الأخطاء عند محاولة concat تتكاثر الملفات في ملف واحد:
أ.js
function a() {
/* this is my function a */
}
a()
ب.js
(function() {
/* This is my closure */
})()
إذا كنا concat هذه الملفات معا وسوف يسبب مشاكل.
لذلك تذكر أن تضع يديك ;
أمام (
وربما أيضا عدد قليل من الأماكن الأخرى.راجع للشغل. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;
هي صحيحة تماما جافا سكريبت