Возможно ли это в javascript? - PullRequest
2 голосов
/ 31 января 2010

Я работаю над фреймворком 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();
    }
  };
};

Ответы [ 3 ]

2 голосов
/ 31 января 2010

Рассмотрим этот пример, используя ваш код

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 в точке, в которой оно выполняется, это будет работать, как и ожидалось.

Немного не по теме, но вы затронули сферу функций. Функции имеют лексическую область видимости, то есть они создают свою область видимости в той точке, в которой они определены (в отличие от выполняемой), и позволяют создавать замыкания; Закрытие создается, когда функция сохраняет ссылку на свою родительскую область даже после возвращения родительского элемента.

2 голосов
/ 01 февраля 2010

То, что вы ищете, называется " динамическая область действия ", где привязки разрешаются путем поиска в текущей цепочке вызовов. Это не слишком распространено за пределами семейства Lisp (Perl поддерживает это с помощью ключевого слова local). Динамическая область видимости не поддерживается в JS, который использует лексическую область видимости .

0 голосов
/ 31 января 2010

Помещение 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);
    }
  };
};
...