ООП, закрытые функции внутри метода верхнего уровня пространства имен - PullRequest
4 голосов
/ 24 марта 2012

У меня есть сценарий 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 не является функцией.

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

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

Ответы [ 2 ]

7 голосов
/ 24 марта 2012

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

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

  return {
    run: function() {
        var selectedText = getSelText();
        alert (selectedText);
    }
  };
})()
4 голосов
/ 24 марта 2012

Если вы объявляете 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;
}

Другая похожая конструкция в Javascript - это оператор функции, в отличие отфункциональные выражения:

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

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

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

...