2012-03-24 10 views
4

У меня есть сценарий Js, который декларирует пространство имен, то есть метод, называемый run(), который я могу назвать внутри сценария XUL как myNamespace.run():ООП, частные функции внутри метода верхнего уровня пространства имен

var myNamespace = { 
    run: function() { 
     var selectedText = getSelText(); 
     alert (selectedText); 

     var getSelText = function() { 
      var focusedWindow = document.commandDispatcher.focusedWindow; 
      var selText = focusedWindow.getSelection(); 

      return selText.toString(); 
     } 
    } 
} 

Я хочу, чтобы иметь возможность позвонить getSelText() внутри myNamespace.run(), не требуя объявить getSelText() как еще одну функцию верхнего уровня от myNamespace. Вместо этого он должен быть как частный метод внутри myNamespace.run().

Когда я запускаю этот скрипт я получаю сообщение об ошибке:

getSelText is not a function.

Я довольно новыми для JavaScript, так что я не знаю, лучший способ проектирования этого. Возможно ли добиться того, что я пытаюсь сделать? Неужели я ошибаюсь?

Цените любую помощь!

ответ

4

Если вы заявляете getSelText как var, он должен быть представлен перед любыми заявлениями, в которых вы его используете. Просто сделайте оператор var getSelText = ... первым утверждением в функции run.


Справочная информация:

var заявления в Javascript являются "поднятые" в верхней части функции они объявлены в, так что это:

function() { 
    var a = 42; 
    // Other stuff... 
    var b = 23; 
} 

на самом деле означает это:

function() { 
    var a = 42, b; 
    // Other stuff... 
    b = 23; 
} 

Anoth эр подобная конструкция в JavaScript, функция заявление, в отличие от функционирования выражения:

function() { 
    var fn1 = function() { return fn2(); }; // Function expression 
    alert(fn1()); 

    // Function statement 
    function fn2() { 
     return "Hello from fn2"; 
    } 
} 

Если вы запускали код выше, будет успешно бдительное «Привет из fn2». Это связано с тем, что операторы функций поднимаются на вершину до любого другого оператора в пределах области, в которой они объявлены. Как вы можете видеть, это может стать очень запутанным. Вероятно, лучшим соглашением является использование выражений функций и объявление их в том порядке, в котором вы нуждаетесь.

+1

благодарит за информацию! Также выяснилось, что я могу объявлять функции без оператора var и вызывать их внутри run() – bobbyrne01

+0

один маленький nitpick, переменные поднимаются вверх, но инициализации нет. 'b'' undefined' в вашем примере, если «другой материал» обращается к нему. Тогда он установлен на '23'. Вы правы, что операторы функций будут работать, если они используются до их создания (в области.) –

+0

Спасибо! Я исправил свой ответ. – FishBasketGordo

7

Это называется шаблоном модуля. Создайте анонимную функцию (для определения области), которая немедленно вызывается и возвращает открытый интерфейс.

var myNamespace = (function() { 
    // private functions for your namespace 
    var getSelText = function() { 
     ... 
    }; 

    return { 
    run: function() { 
     var selectedText = getSelText(); 
     alert (selectedText); 
    } 
    }; 
})()