Каждая функция в Javascript имеет свою область видимости. Это означает, что каждая переменная, которую вы определяете с помощью ключевого слова var, будет доступна только внутри этой функции. Это означает, что когда вы вызываете setFoo(10)
, вы создаете переменную foo, присваиваете ей значение пять, после чего она немедленно уничтожается, потому что выходит из области видимости.
Существует несколько способов решения этой проблемы. Первым будет удалить ключевое слово var. Это поместило бы foo в глобальную область, что означает, что это доступно везде. Тем не менее, это не рекомендуется, вы хотите сохранить глобальную область как можно более загроможденной, чтобы при наличии кода JavaScript, предоставленного несколькими людьми на одной странице, они не могли перезаписывать переменные других людей. Еще один способ сделать это будет так:
function setFoo(val){
var foo = val;
alertfoo = function(){
alert(foo)
}
}
В этом примере единственное, что вы помещаете в глобальную область видимости, - это функция alertfoo, потому что вы хотите, чтобы она была доступна везде. Функция alertfoo определена внутри функции setFoo, это означает, что, хотя foo должен был выйти из области видимости после выполнения setfoo, он сохраняется в памяти, потому что alertfoo имеет к нему доступ.
Это делает для некоторых хороших уловок. Например, предположим, что вы создаете библиотеку javascript, которая будет включена на чужие страницы, вы захотите создать область, внутри которой вы можете определять переменные, не загрязняя глобальную область. Наиболее распространенный способ сделать это - объявить самозапускающуюся функцию. Это функция, которая выполняется сразу после определения, она выглядит так:
(function(){
//set variables you want to be global in your own code
var mainpage = document.getElementById('main');
//define functions you want to make available to other people in a way that puts them in the global scope
setMainElement = function(newmain){mainpage = newmain;}
})();
Вы можете сделать это еще лучше, сделав только один объект глобальным, и предоставьте свой интерфейс через методы этого объекта, таким образом, вы создадите пространство имен со всеми функциями, содержащимися в вашей библиотеке. В следующем примере для этого используется литерал объекта. В javascript вы можете создать объект, поместив пары ключ / значение в фигурные скобки. пары ключ / значение являются свойствами объекта. например:
(function(){
var privatevar = 10,otherprivate=20;
publicInterface = {
'addToPrivate': function(x){privatevar+=x;},
'getPrivate': function(){return private}
};
})();