سؤال

أحاول تعلم extjs وجافا سكريبت الموجهة نحو الكائن بشكل عام. لقد رأيت أشخاصًا يحددون الفصول الدراسية في مساحات أسماء مخصصة بطريقتين. ما الفرق بين هاتين الطريقتين؟

طريقة 1

Ext.ns('myapp.cars');
(function(){
    var Car = Ext.extend(Object, {
       //...
    })

    myapp.cars.Car = Car;
})()

الطريقة 2

Ext.ns('myapp.cars');
myapp.cars.Car = Ext.extend(Object, {
       //...
});

الطريقة 2 أسهل في القراءة وتتطلب رمزًا أقل ؛ هل هناك أي سبب من الأسباب 1؟ شكرًا!

هل كانت مفيدة؟

المحلول

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

فمثلا:

Ext.ns('myapp.cars');
(function(){

    var carInfo = {
      goodEngine: true
    };

    var Car = Ext.extend(Object, {
       info: carInfo
    });

    myapp.cars.Car = Car;
})()

// carInfo is undefined here, so this will give an error
alert( carInfo.goodEngine );

لذا ، فإن الطريقة الأولى مفيدة للغاية إذا كنت تعمل مع مجموعة من المتغيرات التي لن تستخدمها لاحقًا.

نصائح أخرى

فيما يلي معادلة عملياً:

var Car = Ext.extend(Object, {
   //...
});

myapp.cars.Car = Car;

... و:

myapp.cars.Car = Ext.extend(Object, {
   //...
});

في المثال الأول ، كنت تستخدم متغيرًا مؤقتًا للاحتفاظ بمرجع إلى الكائن الذي تم إنشاؤه حديثًا ، والذي يتم نسخه بعد ذلك myapp.cars.Car (يتم نسخ المرجع ، وليس الكائن). في المثال الثاني ، ستقوم بتعيين المرجع إلى الكائن مباشرة إليه myapp.cars.Car.

السبب في أن مثالك الأول كان محاطًا بالوظيفة المجهولة للذات (function(){ })() هو الحد من نطاق هذا المتغير المؤقت. يتم ذلك بشكل عام حتى لا يلوث مساحة الاسم العالمية مع ذلك Car عامل. إذا كان هناك الآخر Car متغير محدد في مكان آخر ، لن يتعارض مع هذا. مثال:

var Car = "My Nice Car";

(function(){
    var Car = Ext.extend(Object, {
       //...
    });

    myapp.cars.Car = Car;
})();

alert(Car); // Still "My Nice Car"
            // No conflict with the `Car` variable in the self invoking function.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top