Simplistic. Очень нормальный вид, почти утешительный:
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
Тем не менее. Что, если я добавлю на свою страницу действительно удобную библиотеку javascript, которая переводит продвинутые символы в их представления базового уровня?
Подожди ... что?
Я имею в виду. Если кто-то вводит символ с каким-то акцентом (например, французский или испанский), но мне нужны только английские символы? A-Z в моей программе? Хорошо ... Испанские символы 'n ~' и французский 'e /' (я использовал два символа каждый для них, но вы, вероятно, можете сделать мысленный скачок в символ, который представляет акценты), эти символы могут быть переведены в базовые символы 'n' и 'e'.
Итак, кто-то хороший человек написал всеобъемлющий конвертер символов, который я могу включить в свой сайт ... Я включаю его.
Одна проблема: в нем есть функция с именем 'name', аналогичная моей функции.
Это то, что называется столкновением. У нас есть две функции, объявленные в одном scope с одним и тем же именем. Мы хотим избежать этого.
Так что нам нужно как-то расширить наш код.
Единственный способ создать область видимости кода в javascript - это обернуть его в функцию:
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
Это может решить нашу проблему. Теперь все закрыто и доступно только из наших открывающих и закрывающих скобок.
У нас есть функция в функции ... на которую странно смотреть, но совершенно законную.
Только одна проблема. Наш код не работает.
Наша переменная userName никогда не отображается в консоли!
Мы можем решить эту проблему, добавив вызов нашей функции после существующего блока кода ...
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
main();
Или раньше!
main();
function main() {
// We are now in our own sound-proofed room and the
// character-converter libarary's name() function can exist at the
// same time as ours.
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
Второстепенная проблема: каковы шансы, что название «главный» еще не использовалось? ... очень, очень стройный.
Нам нужно БОЛЬШЕ видимости. И какой-то способ автоматически выполнить нашу функцию main ().
Теперь мы подошли к функциям автозапуска (или самозапускающимся, самозапускающимся и т. Д.).
* +1040 * (() {}) (); * * тысяча сорок-одна
Синтаксис неловкий как грех. Тем не менее, это работает.
Когда вы заключаете определение функции в скобки и включаете список параметров (другой набор или скобки!), Он действует как функция , вызывая .
Итак, давайте снова посмотрим на наш код с некоторым самовыполняющимся синтаксисом:
(function main() {
var userName = "Sean";
console.log(name());
function name() {
return userName;
}
}
)();
Итак, в большинстве учебных пособий, которые вы читаете, теперь вы будете подвергаться бомбардировке термином «анонимное самореализация» или чем-то подобным.
После многих лет профессионального развития я настоятельно призываю вас назвать каждую написанную вами функцию для целей отладки.
Когда что-то пойдет не так (и будет), вы будете проверять обратную трассировку в своем браузере. всегда легче сузить проблемы с кодом, когда записи в трассировке стека имеют имена!
Очень скучный, и я надеюсь, что это поможет!