سؤال

هل وضع وظيفة لها تأثير على أداء الإغلاق داخل نطاق ؟ إذا أين هو المكان الأمثل لوضع هذه الوظائف ؟ إن لم يكن هو ضمني من قبل جمعية الإغلاق سببا كافيا لوضع وظيفة في مكان آخر منطقيا ؟

فعلى سبيل المثال ، إذا فو لا تعتمد على قيمة localState, هل حقيقة أن localState يمكن الوصول إليها من فو آثار ما فو'ق وقت التنفيذ ، استخدام الذاكرة ، الخ ؟

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

وبعبارة أخرى ، هل سيكون هذا خيارا أفضل, وإذا كان الأمر كذلك لماذا ؟

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

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

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
هل كانت مفيدة؟

المحلول

كل وظيفة في جافا سكريبت هو الإغلاق.وقت التشغيل لحل متغير قيمة فقط تكبدها إذا كان المتغير المشار إليها من خلال وظيفة.على سبيل المثال, في هذا المثال الدالة y يلتقط قيمة x على الرغم x هو عدم الرجوع إليها مباشرة من قبل y:

var x = 3;
function y() eval("x");
y();
3

نصائح أخرى

سواء تلك القصاصات تعادل, لأن كلاهما يعرف في (نفس) البيئة من وظيفة مجهول أنت خلق.أعتقد أنك سوف تكون قادرة على الوصول إلى localState من foo وفي كلتا الحالتين.

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

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

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

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

أي أنه لا يهم ما إذا كان "وظيفة فو()" قبل أو بعد "فار localState" داخل هذه الكتلة.ذلك قد مسألة ما إذا كان "وظيفة فو()" في هذه الكتلة أو أرفق واحد (إذا كان يمكن رفع إلى أعلى نطاق لأنها لا تستخدم أي المتغيرات المحلية);هذا يعتمد على التفاصيل الخاصة بك جافا سكريبت مترجم.

في أمثلة الفرق لا يهم حقا.حتى لو فو هو في نطاق عالمي لن يكون لديك مشكلة.

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

للحصول على فكرة أفضل, حاول القيام بما يلي مثالين على ذلك:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

الفرق الوحيد بين الثاني و الأول هو نمط يستخدمونها تعلن عن وظائف.ثاني واحد يولد إشارة الخطأ.

الهتافات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top