Возможно ли это в javascript?

Я работаю на основе 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);
    }
  };
};

})();

То, что я пытаюсь сделать, это объявить переменные дальше по цепочке областей видимости, чтобы они могли быть доступны в модуле без использования ключевого слова this, как во втором примере. Я не верю, что это возможно, поскольку похоже, что область выполнения функций запечатана при объявлении функции.

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();
    }
  };
};

3 ответа

Решение

То, что вы ищете, называется " динамическая область видимости", где привязки разрешаются путем поиска в текущей цепочке вызовов. Это не слишком распространено за пределами семейства 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);
    }
  };
};
Другие вопросы по тегам