Что вы называете набором Javascript замыканий, которые имеют общий контекст? - PullRequest
5 голосов
/ 13 июня 2010

Я пытался выучить замыкания (в Javascript), что вредит моему мозгу после слишком многих лет использования C # и C ++.Я думаю, что теперь у меня есть базовое понимание, но меня беспокоит одна вещь: я посетил множество веб-сайтов в этом Поиске Знаний, и нигде не видел ни слова (или даже простой фразы из двух слов), что означает «наборJavascript замыкания, которые имеют общий контекст выполнения ".Например:

function CreateThingy (name, initialValue)
{
    var myName = name;
    var myValue = initialValue;

    var retObj = new Object;

    retObj.getName = function() { return myName; }
    retObj.getValue = function() { return myValue; }
    retObj.setValue = function(newValue) { myValue = newValue; }

    return retObj;
};

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

Спасибо!

- Ред

Ответы [ 3 ]

3 голосов
/ 13 июня 2010

Крокфорд популяризировал термин " привилегированный метод " для обозначения функций, которые имеют доступ к области действия своего конструктора (где объявлены закрытые члены).

Я бы назвал их «Набор функций JavaScript, которые совместно используют общую область действия» .

«контекст выполнения» часть фразы, которую вы публикуете, может создать путаницу между Контексты исполнения , описанные в спецификации, значение this, которое также широко известно как "контекст функции" или «контекст объекта» и область действия функции, на которую здесь действительно ссылаются.

1 голос
/ 13 июня 2010

Вы можете назвать это class, но это просто хеш-таблица с кучей записей, некоторые из которых являются функциями (или замыканиями).Более идиоматический способ сделать это в Javascript - использовать прототипы.

Некоторые ссылки, которые помогут вам:

0 голосов
/ 13 июня 2010

Это близко к шаблону модуля . Используйте выражение вроде этого:

var thingy = (function(specObj) {
    var my = {},
        privateVar = blah,
        someOtherPrivateVar = [];

    my.getSomeVal() {
        return specObj.someVal;
    }
    my.getAnotherVal() {
        return specObj.AnotherVal;
    }
}({
    someVal: "value",
    anotherVal: "foo"
}));

Я инициализировался литералом объекта, потому что использование именованного объекта позволило бы изменить состояние вещи, изменив именованный объект. Для этого есть другие варианты.

Вот еще одна хорошая ссылка на варианты шаблона модуля: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

Почти само собой разумеется, но Крокфорд Javascript: The Good Parts содержит хорошую трактовку этого стиля и его специфические преимущества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...