Зачем перед функцией знак "!" ? Для красоты?
Это "говорит" компилятору что начинается выражение, т.е. его нужно выполнить.
Обращение к локальным переменным действительно производит меньше нагрузки?
Да, локальные переменные быстрее замкнутых переменных, а глобальные ещё медленнее.
И стоит ли помещать document, window и т.п в замыкание по этой же причине
Нет, лучше поменьше к ним обращаться.
Какие еще есть способы подобного улучшения кода? В плане нагрузки, скорости?
Много и под разные движки:
* Не используйте глобальные переменные (для внутреннего кода)
* Делайте маленькие ф-ии - они лучше оптимизируются, (но сам вызов большого кол-ва ф-ий замедляет код и иногда "инлайн" код лучше).
* Не используйте try-catch (везде попало) - они отключают оптимизацию
* Не передавайте arguments по ссылке - отключается оптимизация
* Не меняйте тип переменной, например если храните число, то не меняйте на строку - лучше сделать новую переменную
* Уменьшайте кол-во неявных преобразований (+ используйте "use strict")
* Если у вас много однотипных объектов, то делайте их через "класс" (и в дальнейшем не расширяйте атрибутами)
* Используйте массивы как массивы, а не как хеш-объекты (не используйте for in), храните в них однотипные объекты
* Где нужная бо'льшая скорость можете попробовать asm.js
* Подмена "scope" через call/apply замедляет вызов (в сравнении с прямым вызовом ф-ии)
* Не используйте with/eval
...
* Пробегитесь по уже написанным статьям в интернете по оптимизации.
* Сравнивайте конкурирующие куски кода по скорости самостоятельно, например на jsperf, и делитесь результатами с сообществом.