Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> клонирование объекта 
:(
    Опции темы
Сisa
  Дата 2.5.2015, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Почему, если убрать комментарий, то все перестает выполняться :

Код

function clone(o) {
    if(!o || "object" !== typeof o)return o;    
    var p,v,c = "function" === typeof o.pop ? [] : {};    
    for(p in o) {
        if(o.hasOwnProperty(p)) {
            v = o[p];
            if(v && "object" === typeof v) c[p] = clone(v);    
      else c[p] = v;
        }
    }
    return c
}

var as={};
as.a=function(a){alert(10*a)};

a=function(a){
 try{  
  var w = clone(as);
  w.a(17);

  //var as = clone(w);

  as.a(19);
 }catch(e){ alert(e.name)  }  
}
a();


Точнее, можно ли как то сделать так, 
чтобы убрав комментарий функция выполнялась так же, как и вместе c закомментированной строкой,  
т .е. с образованием нового одноименного объекта "as" ?

(про "Объявления, именование и «поднятие» переменных и функций" читал, пробовал, не получается обхитрить :(  и что совсем-совсем нельзя? никак?  )



Это сообщение отредактировал(а) Сisa - 3.5.2015, 13:50
PM MAIL   Вверх
MeGaBoJIbT
Дата 4.5.2015, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.5.2012

Репутация: 1
Всего: 1



Потому что интерпретатор создает локальные переменные на этапе входа в функцию и ему все равно где объявить переменную, в середине функции или в начале.
То есть если кусок раскомментить, то глобальной переменной as внутри функции не будет, и программа начнет вести себя неожиданно)

Да, в рекурсивных функциях естественно могут использоваться локальные переменные, потому что для каждого рекурсивного вызова создается свой контекст выполнения, включающий в себя локальные переменные. Чрезмерно упрощая, рекурсивная функция - это как бы много очень похожих друг на друга функций, а не одна. Хорошо это расписано здесь: https://learn.javascript.ru/recursion

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Сisa
Дата 4.5.2015, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Благодаря Вам MeGaBoJIbT я это уже почти понял :(( , 
но все же как то очень хочется чтобы хоть как то, но выполнить это вот невозможное smile
Однако. Это все недоработки то ли языка, то ли браузера! smile но никак не программера smile
Есть локальные - и должны они быть локальными, а глобальные - на то они и глобальные smile))))))))
В итоге отказался от одноименных названий переменных, объектов, функций в js, а заодно и id в css.


PM MAIL   Вверх
MeGaBoJIbT
Дата 4.5.2015, 17:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.5.2012

Репутация: 1
Всего: 1



Выполнить что? Назвать одинаково глобальную и локальную переменную в рамках одной функции?
Мне не приходит в голову как это можно сделать в js, и главное зачем.
Хорошая практика программирования на большинстве языков - осмысленно и содержательно именовать переменные. Хорошая практика программирования на js - не засорять глобальную область видимости. Поэтому когда возникает желание назвать локальную переменную как глобальную это плохо само по себе. А если еще и необходимо использовать локальную перменную и одноименную ей глобальную в одной и той же функц, то кто-то явно что-то делает не так.

99% что браузер отношения к этому не имеет и это написано в стандарте языка, правда искать конкретную строчку в стандарте чтобы увериться, мне влом.

Мне кажется неправильно считать это "недоработкой" языка. Программирование - сложная, неинтуитивная штука by design, каждый язык имеет множество таких вот нюансов. 
Большинство нюансов обусловлены особенностью задач которые стоят при разработке языка, упрощают решение одних задач,  и в то же время усложняют другие. JS изначально создавался как простейший инструмент для работы с html-страничками. Есть легенда что всю грамматику языка, стандарт и интерпретатор разработали с нуля примерно за пару недель. Никто не представлял во что он вырастет.
Другие нюансы обусловлены опытом разработки. То что при первом взгляде новичка может казаться страшным косяком языка, может при более близком изучении оказаться огромным плюсом.
В общем, резюмируя, это не недоработка, а просто немного неинтуитивное поведение языка, которое есть в каждом языке. Появится опыт и такое поведение станет интуитивным =)

Цитата

В итоге отказался от одноименных названий переменных, объектов, функций в js, а заодно и id в css.

Давно пора) Алгоритмы - это алгоритмы, а данные - это данные, одинаково называться им ни к чему
PM MAIL   Вверх
Сisa
Дата 5.5.2015, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Но вот хочется же! ну чтобы это невозможное стало возможным, наверно надо подождать новой версии языка, и когда нынешние стандарты устареют?
Читая мануалы встречаешь, что вот так делать нельзя, одноименные локальные глобальные и т.п., думал может быть есть такой яп который не имеет подобных проблем и начал читать asm, но и там оказывается есть свои заморочки, казалось бы asm это же чистое электричество, вольты и амперы, нули и единички и не javascript : ) 
javascript один, един,  в отличие от asmов : )

Почему начал тему? потому что в скрипте потребовалось создать объекты в нескольких функциях на основе имеющегося в глобальной видимости объекта, но каждый из новых будет самостоятелен, а в этом начальном объекте есть ссылки на него же, но без this а по имени, к тому же первоначальный объект надо было удалять,  и вот чтобы не переделывать/переписывать заново весь объект и решил поэкспериментировать. Результат отрицательный. А ведь могло же получиться? Нельзя же жить шаблонами и стандартами, так пожалуй творчеству места не останется?
И почему в js new какое то такое, что требуется clone - стандарт?

MeGaBoJIbT Вы так хорошо все объяснили, и так твердо в это верите, что я полностью с Вами согласен! Спасибо за терпение!



PM MAIL   Вверх
ksnk
Дата 5.5.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Сisa @  5.5.2015,  10:07 Найти цитируемый пост)
Но вот хочется же! ну чтобы это невозможное стало возможным, наверно надо подождать новой версии языка, и когда нынешние стандарты устареют?

Можно еще написать свой язык  smile Убедить сообщество, что он имеет право на существование.
Код

a=function(a){
 try{  
  var w = clone(as);
  w.a(17);
 //var as = clone(w);
 // as.a(19);
  (function(as){
    as.a(19);
  })(clone(w));
 }catch(e){ alert(e.name)  }  
}

случайно, не будет решением этой странной задачи?




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Сisa
Дата 5.5.2015, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Однако. 
Это не только недоработки языка, и браузера,  а в первую очередь программера!

Вот не зря же попросил помощи на форуме - ksnk в одно движение все порешал !!!
Творчеству все же место не ограничено, особенно когда есть такие знающие люди.
Дело мастера боится? один штрих все поменял! Ну то есть и переменной то не нужно, 
и имя ей не нужно, совсем. И казалось бы - а почему бы сразу так взять да и не написать?

Свой язык заманчиво ... , но явно мне не по силам, а то бы с удовольствием smile

Код

(a=function(a){  
  var w = clone(as);
  w.a(17);
  var b= function(as){
   as.a(19);
  };
  b(clone(w));   
})();
 (b=function(){
 try{  
  var w = clone(as);
  w.a(11);
  var b= function(as,b){

   w=null;

   as.a(b);
  };
  b(clone(w),12);   
 }catch(e){ alert(e.name)  }
})();



Это сообщение отредактировал(а) Сisa - 5.5.2015, 21:24
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1224 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.