2010-01-30 5 views
2

Я работаю над javascript framework. У меня есть несколько независимых сценариев, которые выглядят так:Возможно ли это в 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); 
    } 
    }; 
}; 

})(); 

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

Чтобы уточнить, где я пытаюсь определить 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(); 
    } 
    }; 
}; 
+0

Где находится 'wot', определенный в первом примере? –

+0

@musicfreak: OP говорит, что он получает ошибку, которая 'wot' не определена. Если вы не определяете переменную с ключевым словом 'var', JS будет искать ее как свойство объекта' window'. –

+0

@ Тобиас: Я так понимаю. Мне было интересно, где находится объект, который OP хочет получить, - другими словами, какую область он ищет. –

ответ

2

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

-1

Положив 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); 
    } 
    }; 
}; 
2

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

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

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