سؤال
غالبًا ما أرى كائنًا عالميًا محدد في رمز JavaScript ليكون بمثابة مساحة اسم.
var MyNS = {a: function() {}, ... };
لكن في بعض الأحيان ، أرى أن الناس يتركون الكلمة الرئيسية "var" مثل
MyNS = {a: function() {}, ...};
أؤمن بمتصفحات الويب إذا لم تحدد متغيرًا مع VAR ، فسيتم وضعه في كائن النافذة ، والذي يعمل كمساحة اسم عالمية. نظرًا لأنه يحفظ بعض بايت النص من خلال عدم استخدام "var" هل هناك سبب لاستخدام الكلمة الرئيسية لهذا الغرض المحدد ?
المحلول
نظرًا لأنه يحفظ بعض بايت النص من خلال عدم استخدام "var" هل هناك سبب لاستخدام الكلمة الرئيسية لهذا الغرض المحدد؟
لا أوصيك بتجنب var
الكلمة الرئيسية ، حتى لو كنت على رمز عالمي.
يبدو أن الطريقتين متشابهتين ولكنهما في الواقع ليسا متماثلين ، الأول هو أ إعلان متغير, ، ال كائن متغير على الكود العالمي ، هو الكائن العالمي نفسه ، ولهذا السبب يمكن الوصول إلى المتغيرات العالمية كخصائص للكائن العالمي (window.MyNS
).
والثاني هو مهمة غير معلنة, ، ينشئ خاصية على الكائن العالمي إذا لم يتم العثور على المعرف في سلسلة النطاق.
سبب حقيقي لتجنب ذلك هو أنه في المعيار الجديد للغة ، الطبعة الخامسة ECMASCRIPT ، تحت الوضع الصارم, ، ستعمل مهمة على معرف غير معلن ReferenceError
كسر الكود الخاص بك.
هناك أيضًا فرق آخر دقيق بين المثالين ، فإن التثبيت المتغير ينشئ الخاصية على الكائن العالمي غير قابل للتحرير:
var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'
في حين أن المهمة غير المعلنة لا:
myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'
المقالة الموصى بها:
نصائح أخرى
استخدام var
يحدد متغير محلي في النطاق الحالي. إذا كنت في النطاق العالمي ، فهي مكافئة بشكل فعال. استخدام var
هناك المزيد من أجل الفهم والقدرة على الصيانة ، لأن النية واضحة تمامًا. إنه أقل وضوحًا دون تهيئة var
.
في أي نطاق محلي ، إذا MyNS
تتم تهيئته في مكان ما إلى سلسلة النطاق ، وستكون في الكتابة فوق المتغير المحلي بدلاً من تحديد متغير عالمي.
أعتقد أنه من الجيد استخدام الكلمة الرئيسية لأنها تجعلك في العادة ، وتساعد على منع الأخطاء السيئة عندما تنساها داخل أجسام الوظائف. إنه لطيف أيضًا في حالة ترحيل بعض التعليمات البرمجية العالمية إلى وظيفة.
لكن لا ، هذا ليس ضروريًا تمامًا.
تعديل - eyelidnes لها نقطة جيدة حقًا ، على الرغم من أنك إذا كنت تكتب رمزًا على المستوى العالمي ، فهذا ليس مشكلة بالفعل.
نمط مقاوم للرصاص إلى حد ما رأيته هو تهيئة مساحات الأسماء العالمية مع شيء مثل هذا:
(function(window, undefined) {
var foo = { stuff: "in my namespace", ... };
window.foo = foo;
})(this);
على المستوى العالمي ، this
سيكون كائن النافذة (إذا كنت في متصفح ؛ إذا لم يكن الأمر كذلك ، فهذا أي شيء هو الكائن العالمي في هذا السياق).
دوغلاس كروكفورد حول هذا السؤال الدقيق:http://www.yuiblog.com/blog/2008/04/16/global-domination-bart-two/
يستقر على استخدام تعليق مع التهيئة ، ولكن بدون var
. إن تحليله للمقايضات يستحق القراءة حتى لو كنت لا توافق.