Глобальные имена
Мы полностью отказались от декларирования имён, в типизированных языках декларирование посредством ключевых слов:
int, float, double, String
и т.д. необходимо. В утиных языках имеется лишь одно ключевое слово:
var,
при помощи которого декларируется имя любого типа. Декларация посредством ключевого слова var служит в js для того, чтобы провести границу между локальными и глобальными именами. В "Утке" тоже можно пользоваться локальными и глобальными именами, вот как это делается. Каждое простое имя, впервые возникшее внутри функции, является локальным. Например, пусть
fun = function(x, y){
uu = 5;
return(x + y);
}
- функция сложения двух чисел, внутри тела которой создано имя uu со значением 5. Вслед за определением этой функции обратимся к ней, а также попытаемся узнать значение имени uu:
show(fun(4, 3));
show(uu);
Результат выполнения этих команд:
fun(4, 3) = 7
uu = undefined
fun = function(x, y){
uu = 5;
show(uu);
return(x + y);
}
show(fun(4, 3));
Вот что мы увидим в результате:
uu = 5
fun(4, 3) = 7
В самом деле, в результате обращения к функции fun её тело было выполнено, в частности были выполнены команды создания имени uu со значением 5 и вывода значения в консоль. Сделаем теперь другой опыт: создадим имя uu вне функции, а обратимся к нему внутри функции:
uu = 5;
fun = function(x, y){
show(uu);
return(x + y);
}
show(fun(4, 3));
результат запуска будет таким:
uu = 5
fun(4, 3) = 7
это значит, что
uu = 5;
fun = function(x, y){
show(uu);
uu = 9;
show(uu);
return(x + y);
}
show(fun(4, 3));
show(uu);
запускаем и вот что мы увидим:
uu = 5
uu = 9
fun(4, 3) = 7
uu = 5
Это значит, что изменение значения имени uu произошло лишь внутри тела функции, а снаружи значение имени не изменилось.
dd = {uu: 5};
show(dd.uu);
fun = function(x, y){
show(dd.uu);
dd.uu = 9;
return(x + y);
}
show(dd.uu);
Результат запуска этого фрагмента таков:
dd.uu = 5
fun(4, 3) = 7
dd.uu = 9
int, float, double, String
и т.д. необходимо. В утиных языках имеется лишь одно ключевое слово:
var,
при помощи которого декларируется имя любого типа. Декларация посредством ключевого слова var служит в js для того, чтобы провести границу между локальными и глобальными именами. В "Утке" тоже можно пользоваться локальными и глобальными именами, вот как это делается. Каждое простое имя, впервые возникшее внутри функции, является локальным. Например, пусть
fun = function(x, y){
uu = 5;
return(x + y);
}
- функция сложения двух чисел, внутри тела которой создано имя uu со значением 5. Вслед за определением этой функции обратимся к ней, а также попытаемся узнать значение имени uu:
show(fun(4, 3));
show(uu);
Результат выполнения этих команд:
fun(4, 3) = 7
uu = undefined
Имя, созданное внутри тела функции, невидимо снаружи.
Давайте поместим эту же команду внутрь тела функции, а также сразу после определения функции обратимся к ней:fun = function(x, y){
uu = 5;
show(uu);
return(x + y);
}
show(fun(4, 3));
Вот что мы увидим в результате:
uu = 5
fun(4, 3) = 7
В самом деле, в результате обращения к функции fun её тело было выполнено, в частности были выполнены команды создания имени uu со значением 5 и вывода значения в консоль. Сделаем теперь другой опыт: создадим имя uu вне функции, а обратимся к нему внутри функции:
uu = 5;
fun = function(x, y){
show(uu);
return(x + y);
}
show(fun(4, 3));
результат запуска будет таким:
uu = 5
fun(4, 3) = 7
это значит, что
имя, созданное вне функции, внутри функции продолжает быть видимым.
Перейдём теперь к следующему опыту: попытаемся внутри функции изменить значение имени, созданного вне функции:uu = 5;
fun = function(x, y){
show(uu);
uu = 9;
show(uu);
return(x + y);
}
show(fun(4, 3));
show(uu);
запускаем и вот что мы увидим:
uu = 5
uu = 9
fun(4, 3) = 7
uu = 5
Это значит, что изменение значения имени uu произошло лишь внутри тела функции, а снаружи значение имени не изменилось.
значение имени, созданного вне функции, внутри функции может быть изменено, но вне тела функции оно останется прежним.
Как же быть, если нам потребуется, чтобы функция меняла значение имени, созданного вне функции? Для этого нужно, чтобы имя, созданное вне тела функции находилось внутри ОБЪЕКТа. Проверим это на опыте:dd = {uu: 5};
show(dd.uu);
fun = function(x, y){
show(dd.uu);
dd.uu = 9;
return(x + y);
}
show(dd.uu);
Результат запуска этого фрагмента таков:
dd.uu = 5
fun(4, 3) = 7
dd.uu = 9