سؤال

أنا أعمل على إطار JavaScript. لدي العديد من البرامج النصية المستقلة التي تبدو هكذا:

core.modules.example_module = function(sandbox){
    console.log('wot from constructor ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};

هذه الوظيفة تسمى من نص خارجي آخر. أحاول نقل المتغيرات إلى هذه الوظيفة حتى يمكن الوصول إليها without using the this keyword.

المثال أعلاه سوف يخطئ في قول WOT غير محدد.

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

(function(){

var wot = 'omg';

core.modules.example_module = function(sandbox){
    console.log('wot from creator ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};

})();

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

update
لتوضيح أين أحاول تحديد WOT. في ملف JavaScript منفصل ، لدي كائن يدعو وظيفة وحدة التسجيل مثل هذا

core = function(){
   var module_data = Array();
   return{
    registerModule(){
      var wot = "this is the wot value";
      module_data['example_module'] = core.modules.example_module();
    }
  };
};
هل كانت مفيدة؟

المحلول

ما تبحث عنه يسمى "النطاق الديناميكي"، حيث يتم حل الروابط عن طريق البحث في سلسلة الاتصال الحالية. إنها ليست شائعة جدًا خارج عائلة LISP (يدعمها Perl ، عبر local الكلمة الرئيسية). لا يتم دعم النطاق الديناميكي في JS ، والذي يستخدم النطاق المعجمي.

نصائح أخرى

النظر في هذا المثال ، باستخدام الكود الخاص بك

var core = {}; // define an object literal
core.modules = {}; // define modules property as an object

var wot= 'Muhahaha!';

core.modules.example_module = function(sandbox){

  console.log('wot from creator ==', wot);

  return {
    init: function() {
       console.log('wot from init ==', wot);

    }
  }
}

// logs wot from creator == Muhahaha! to the console    
var anObject = core.modules.example_module(); 

// logs wot from init == Muhahaha! to the console
anObject.init(); 

طالما wot يتم تعريفه في مكان ما في سلسلة النطاق ل core.modules.example_module عند النقطة التي يتم تنفيذها ، سيعمل هذا كما هو متوقع.

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

وضع var wot; في بداية مُنشرك يجب أن يفعل ذلك

core.modules.example_module = function(sandbox){
  var wot;
  wot = 'foo'; //just so you can see it working
  console.log('wot from constructor ==', wot);

  return{
    init : function(){
      console.log('wot from init ==', wot);
    }
  };
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top