الوصول إلى المتغيرات من الوظائف الأخرى دون استخدام المتغيرات العالمية

StackOverflow https://stackoverflow.com/questions/407048

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

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

المحلول

لجعل المتغير المحسوب في وظيفة ملحوظة في وظيفة ب-لديك ثلاثة خيارات:

  • جعله العالمية ،
  • تجعل من كائن الملكية ، أو
  • تمر كمعلمة عندما تدعو ب من أ.

إذا كان البرنامج هو صغير إلى حد ما ثم globals ليست سيئة للغاية.وإلا فإنني النظر في استخدام الطريقة الثالثة:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

نصائح أخرى

وأعتقد أن أفضل رهان هنا قد يكون لتحديد واحد متغير عالمي، راقب، وإلقاء المتغيرات الخاصة بك هناك:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

ولا ينبغي لأحد أن يصرخ عليك لفعل شيء مثل ما ورد أعلاه.

والنظر في استخدام النطاقات:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

وكلا local_function وglobal_function حق الوصول إلى كافة المتغيرات المحلية والعالمية.

تعديل : في نمط شائع آخر:

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

وخصائص returned يمكن الآن الوصول إليها من خلال الكائن مساحة الاسم، على سبيل المثال ns.foo، في حين لا يزال الإبقاء على الوصول إلى تعريفات المحلية.

ما كنت تبحث عن يعرف تقنيا باسم الضمادة.

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

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

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

وأيضا المتغيرات العالمية ليست سيئة بطبيعتها والشر. طالما يتم استخدامها بشكل صحيح لا توجد مشكلة معهم.

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

وثمة نهج آخر واحد هو أن التقطت من منتدى آخر دوغلاس كروكفورد ( HTTP : //bytes.com/topic/javascript/answers/512361-array-objects ). ومن هنا ...

ودوغلاس كروكفورد كتب:

و15 يوليو '06

و"إذا كنت ترغب في استرداد الكائنات الهوية، ثم يجب عليك استخدام كائن، وليس مجموعة مصفوفة. منذ ظائف هي كائنات أيضا، هل يمكن تخزين الأعضاء في العمل نفسه ".

function objFacility(id, name, adr, city, state, zip) {

    return objFacility[id] = {

        id: id,
        name: name,
        adr: adr,
        city: city,
        state: state,
        zip: zip

    }
}

objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);

و"يمكن الحصول على الكائن مع"

objFacility.wlevine

وخصائص الكائنات هي الآن مليم من داخل أي وظيفة أخرى.

ولقد وجدت أن يكون مفيدا للغاية في ما يتعلق السؤال الأصلي:

وإرجاع القيمة التي ترغب في استخدامها في functionOne، ثم استدعاء functionOne داخل functionTwo، ثم ضع النتيجة في فار جديدة ومرجعية هذا فار جديد خلال functionTwo. وهذا ينبغي أن تمكنك من استخدام فار أعلن في functionOne، ضمن functionTwo.

function functionOne() {
  var variableThree = 3;
  return variableThree;
}

function functionTwo() {
  var variableOne = 1;
  var var3 = functionOne();

  var result = var3 - variableOne;

  console.log(variableOne);
  console.log(var3);
  console.log('functional result: ' + result);
}

functionTwo();

وأنا لا أعرف تفاصيل القضية، ولكن إذا كانت وظيفة تحتاج القيمة ثم أنها يمكن أن تكون المعلمة التي تم تمريرها من خلال المكالمة.

تعتبر

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

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

وهنا يكمن الجواب (هام: انها ليست الجواب فحص بل الجواب بي "إميل"):

كيفية الحصول على متغير عاد عبر وظائف متعددة - جافا سكريبت / مسج

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