javascript - لغة - شرح جافا سكربت بالعربي pdf




ديناميكيا استدعاء الدالة المحلية في جافاسكريبت (3)

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

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

obj._privateMethod1 = function(arg) {
  //...
};

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

لنرى بعض الرموز (وهذا مثال خيالي) ...

(function(window,$) {

  MyObject = (function($) {
    var obj = {};
    obj.publicMethod = function(number,otherarg) {
      this['privateMethod'+number].apply(this,[otherarg]);
    };

    var privateMethod1 = function(arg) {
      //do something with arg
    };

    var privateMethod2 = function(arg) {
      //do something else with arg
    };

    return obj;
  })($);

  window.MyObject = MyObject;
})(window,jQuery);

هذا لا يعمل لأن "هذا" هو ميوبجيكت والوظائف المحلية لا تتعرض. كما أود أن أكون قادرا على التحقق مما إذا كانت الدالة موجودة قبل محاولة استدعاؤها. على سبيل المثال.

var func_name = 'privateMethod'+number;
if($.isFunction(this[func_name])) {
  this[func_name].apply(this,[otherarg]);
}

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

obj.privateMethod1 = function(arg) {
  //do something with arg
};

obj.privateMethod2 = function(arg) {
  //do something else with arg
};

أنا نفد من الأفكار. مساعدتكم وتقديم المشورة هو موضع تقدير كبير.


لا يمكنك الحصول على مرجع لمتغير محلي بواسطة سلسلة. لديك لإضافة الكائنات المحلية إلى مساحة الاسم:

(function(window,$) {
  // Use "var MyObject = " instead of "MyObject = "!! Otherwise, you're assigning
  //  the object to the closest parent declaration of MyVar, instead of locally!
  var MyObject = (function($) {
    var obj = {};
    var local = {};  // <-- Local namespace
    obj.publicMethod = function(number,otherarg) {
      local['privateMethod'+number].call(this, otherarg);
    };

    var privateMethod1 = local.privateMethod1 = function(arg) {
      //do something with arg
    };

    var privateMethod2 = local.privateMethod2 = function(arg) {
      //do something else with arg
    };

    return obj;
  })($);

  window.MyObject = MyObject;
})(window,jQuery);

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

(function(window,$) {

    MyObject = (function($) {
        var obj = {};
        obj.publicMethod = function(number,otherarg) {

            // Gets reference to a local variable
            var method = eval('privateMethod'+number);

            // Do with it whatever you want
            method.apply(this,[otherarg]);
        };

        var privateMethod1 = function(arg) {
            //do something with arg
        };

        var privateMethod2 = function(arg) {
            //do something else with arg
        };

        return obj;
    })($);

    window.MyObject = MyObject;
})(window,jQuery);

في الواقع هذا الرمز هو سيء جدا وفي 99.9٪ الحالات يجب أن لا تستخدم eval . ولكن يجب أن تعرف كيف يعمل وما يمكنك القيام به معها. أنا نفسي كان عدد قليل جدا من الحالات المحددة عند استخدام eval كان ضروريا.







scope