Давайте смотреть... Странно "functionName =" генерирует меньше IL?
Код:
Public Function Test() As String
Test = "Test"
End Function
Public Function Test2() As String
Return "Test"
End Function
IL:
.method public static string Test() cil managed
{
.maxstack 1
.locals init (
[0] string Test)
L_0000: nop
L_0001: ldstr "Test"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ret
}
.method public static string Test2() cil managed
{
.maxstack 1
.locals init (
[0] string Test2)
L_0000: nop
L_0001: ldstr "Test"
L_0006: stloc.0
L_0007: br.s L_0009
L_0009: ldloc.0
L_000a: ret
}
Как сказал Расс Кам, вы избегаете загрязнения глобального пространства имен, что очень важно в наши дни объединения скриптов из нескольких мест (TinyMCE и т. Д.).
Как сказал Алекс Секстон: это также способствует хорошей организации кода.
Если вы используете эту технику, я бы предложил использовать шаблон модуля. При этом по-прежнему используются объектные литералы, но в качестве возвращаемого значения из функции области видимости:
var MyThingy = (function() {
function doSomethingCool() {
...
}
function internalSomething() {
....
}
function anotherNiftyThing() {
// Note that within the scoping function, functions can
// call each other direct.
doSomethingCool();
internalSomething();
}
return {
doSomethingCool: doSomethingCool,
anotherNiftyThing: anotherNiftyThing
};
})();
Внешнее использование:
MyThingy.doSomethingCool();
Функция области видимости оборачивается вокруг всех ваших функций, а затем вы немедленно вызываете ее и сохраняете ее возвращаемое значение. Преимущества:
{name: function () {...}}
все ваши функции являются анонимными, даже если свойства, ссылающиеся на них, имеют имена.) Инструменты помощи по именам помогают вам, от отображения стеков вызовов в отладчике до сообщения о том, какая функция вызвала исключение. (Обновление 2015: последняя спецификация JavaScript, 6-е издание ECMAScript, определяет большое количество способов, которыми механизм JavaScript должен вывести имя функции. Один из них - когда функция назначается свойству, как в нашем {name: function () {...}}
пример. Так как движки реализуют ES6, эта причина исчезнет.) internalSomething
выше). Никакой другой код на странице не может вызывать эти функции; они действительно личные. Только те, которые вы экспортируете в конце, в операторе return, видны за пределами функции области видимости. Пример возврата различных функций:
var MyUtils = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent('on' + eventName, handler);
}
function hookViaListener(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
return {
hook: window.attachEvent ? hookViaAttach : hookViaListener
};
})();
MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
Использование литерала объекта (также известного как шаблон литерала объекта) не будет загрязнять глобальное пространство имен так сильно, как использование многих функций, объявленных глобально, а также помогает организовать код логическим образом
Для Например, этот литерал объекта
var obj = {
find : function(elem) { /* find code */ },
doSomething: function() { /* doSomething code */ },
doSomethingElse: function() { /* doSomethingElse code */ }
}
по сравнению с
function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }
создаст только одно свойство глобального объекта по сравнению с тремя. Затем вы можете легко использовать такие функции, как
obj.doSomething();
Ребекка Мерфи выступила с докладом об объектных литералах на конференции jQuery в этом году. Одна из лучших причин их использования - это просто хорошая организация кода.
Вот запись Ребекки о шаблоне литерала объекта: http://rmurphey.com/blog/2009/10/15/using-objects -to-организовать-ваш-код /