هل هذا النطاق ممكن في جافا سكريبت؟
-
24-09-2019 - |
سؤال
أنا أعمل على إطار 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);
}
};
};