3

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

var TestClass = function() { 
    function showMessage(text) { 
     $("div").text(text); 
    } 
    return { 
     showMessage: showMessage 
    }; 
}(); 

Я попробовал его в this fiddle, и она работает должным образом в FF, IE, Chrome, Safari. JSLint тоже не об этом говорит.

Я регулярно вижу людей, называющих частный метод _showMessage или showMessageFn. Есть ли веская причина для этого?

Ответ, который я ищу, это то, что он либо терпит неудачу в некоторых ситуациях, может создавать путаницу, либо что люди, изобретающие условные обозначения, кажутся умными.

+0

Это прекрасно работает - вы определяете функцию, называемую 'showMessage()' в контексте вашей внутренней функции, а затем воспринимаете ее и ссылаетесь на нее с помощью свойства showMessage вашего литерала экспортированного объекта. Единственная проблема, которую я вижу, заключается в том, что вы должны обернуть вызов функции в parens, чтобы сделать ее более читаемой. –

+0

Спасибо. Если вы добавите его в качестве ответа, я соглашусь с ним. –

ответ

2

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

Название объекта может быть any valid identifier, поэтому showMessage, конечно, отлично действует. В вашем примере function showMessage(text) создает идентификатор под названием showMessage во внутренней области, ссылаясь на определение функции. Затем вы создаете отдельный идентификатор с именем showMessage как property name on the object literal, которому присваивается значение функции, на которое ссылается внутренний идентификатор. Тот факт, что оба идентификатора имеют одно и то же имя, не имеет значения, поскольку они не существуют в одной области.

Только проблема, которую я вижу, заключается в том, что вы должны обернуть вызов функции в parens, иначе читателю не сразу станет ясно, что функция самозапускается.

Так что:

var TestClass = function() { 
    ... 
}(); 

Становится это:

var TestClass = (function() { 
    ... 
}()); 

Причина частные методы часто начинаются с подчеркивания просто широко используемое соглашение - это показывает, что метод предназначен для private (Javascript не поддерживает модификаторы доступа, поэтому любое свойство или метод, которые не заключены в закрытие, могут быть доступны из внешней области). Принятый ответ this StackOverflow quesion суммирует его отлично.

0

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

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

Смежные вопросы