Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкания как получить доступ к переменным (https://javascript.ru/forum/misc/41188-zamykaniya-kak-poluchit-dostup-k-peremennym.html)

lllypyn 03.09.2013 16:35

Замыкания как получить доступ к переменным
 
Почитал статьи на хабре по замыканиям. Все вопросы в коде.
var name = new Array(''Viktor', 'Daniil', 'Danislav''Osip', 'Ostap');
var family = new Array('Smirnov', 'Ivanov', 'Kuznecov', 'Popov', 'Sokolov');
var email = new Array('@gmail.com', '@tut.by', '@mail.ru', '@hotmail.com');
function getRegistr(){
var name, family, email;
 var rnd = function(){
 name = Math.floor(Math.random()*/*как получить доступ к массиву name?*/.length);
 family = Math.floor(Math.random()*/*как получить доступ к массиву family?*/.length);
 email = Math.floor(Math.random()*/*как получить доступ к массиву email?*/.length);
 };
 return {"name": name,"family": family,"email": email};
};
var t = getRegistr();
alert(name[t.name]);// пишет undefined

Яростный Меч 03.09.2013 16:43

lllypyn,

доступ есть просто по имени, но строчка var name, family, email; перекрывает внешние переменные, заменяя их на внутренние.

рони 03.09.2013 16:49

Цитата:

Сообщение от lllypyn
new Array(''Viktor', 'Daniil', 'Danislav''Osip', 'Ostap');

странный массив
var name = new Array('Viktor', 'Daniil', 'Danislav','Osip', 'Ostap');
var family = new Array('Smirnov', 'Ivanov', 'Kuznecov', 'Popov', 'Sokolov');
var email = new Array('@gmail.com', '@tut.by', '@mail.ru', '@hotmail.com');
function getRegistr(){
 var rnd = function(x){
 return x[Math.floor(Math.random()*x.length)];
 };
 return {"name": rnd(name),"family": rnd(family),"email": rnd(email)};
};
var t = getRegistr();
alert(JSON.stringify(t));

lllypyn 03.09.2013 17:23

Цитата:

Сообщение от Яростный Меч (Сообщение 270661)
lllypyn,

доступ есть просто по имени, но строчка var name, family, email; перекрывает внешние переменные, заменяя их на внутренние.

Так я как раз и читал, что замыкания позволяют не засорять глобальную область видимости
Цитата:

Сообщение от рони (Сообщение 270663)
странный массив
var name = new Array('Viktor', 'Daniil', 'Danislav','Osip', 'Ostap');
var family = new Array('Smirnov', 'Ivanov', 'Kuznecov', 'Popov', 'Sokolov');
var email = new Array('@gmail.com', '@tut.by', '@mail.ru', '@hotmail.com');
function getRegistr(){
 var rnd = function(x){
 return x[Math.floor(Math.random()*x.length)];
 };
 return {"name": rnd(name),"family": rnd(family),"email": rnd(email)};
};
var t = getRegistr();
alert(JSON.stringify(t));

Спасибо, а можете пояснить зачем 1 ретурн? И как получить значение допустим name, getRegistr.name?

Яростный Меч 03.09.2013 17:42

Цитата:

Сообщение от lllypyn
Так я как раз и читал, что замыкания позволяют не засорять глобальную область видимости

для этого надо весь твой код поместить внутрь
(function() {
 ...
})();

но тогда внешние name, family, email по прежнему будут перекрываться внутренними.

вывод: внутренние надо убрать.

lllypyn 03.09.2013 18:00

Цитата:

Сообщение от Яростный Меч (Сообщение 270680)
для этого надо весь твой код поместить внутрь
(function() {
 ...
})();

но тогда внешние name, family, email по прежнему будут перекрываться внутренними.

вывод: внутренние надо убрать.

А почему нельзя вызвать через window.name ? Ведь все глобальные переменные это свойства window.

рони 03.09.2013 18:18

Цитата:

Сообщение от lllypyn
пояснить зачем 1 ретурн?

учить js
Цитата:

Сообщение от lllypyn
как получить значение допустим name, getRegistr.name?

getRegistr().name


Часовой пояс GMT +3, время: 05:16.