" вставляется элемент глобальной (в данном scope) 
	// переменной arr" Вот вы и нашли глобальную переменную... Нашли???  | 
	
		
 Если смущает str - убери её из обоих тестов... 
	Оставь только a и arr. Ну тогда уж точно будет видно, где локальная, где глобальная... просто во втором тесте тогда нибудет никаких действий в функции: почему? - потому что я ВЫНЕС её инициализацию в глобальный контекст!!!  | 
	
		
 Прочтите, пожалуйста, пост №11 
	И скажите - я ответил правильно? Разве у меня в функции не идёт ОБРАЩЕНИЕ к глобальной переменной?  | 
	
		
 ZoNT, 
	Ваш пример наглядно показывает только то, что array.push(element); работает медленнее, чем array[index]; У вас в первом примере используются только локальные переменные, а во втором - две локальные переменные (в своих контекстах), а вторая просто вставляет элемент глобальной. Локальные переменные работают быстрее в любом контектсте. Вот два идентичных примера, проверьте самостоятельно: 
// Пример с локальной переменной:
function F1(){
    var a = [];
    for (var i=0;i<1000;i++) a.push(i);
}
 
var start = new Date();
for (var i=0;i<1000;i++) F1();
var res1 = (new Date())-start;
// Пример с глобальной переменной:
function F2(){
    for (var i=0;i<1000;i++) b.push(i);
}
 
start = new Date();
for (var i=0;i<1000;i++) {
    var b = [];
    F2();
}
var res2 = (new Date())-start;
 
alert([res1,res2]);
 | 
	
		
 Ну ответь же мне: 
	1) мой пример работает? 2) Он на мониторе виден (в смысле существует)? 3) Работает быстрее? 4) "а вторая просто вставляет элемент глобальной" - к глобальной переменной обращается?  | 
	
		
 ZoNT, 
	Вы увиливаете от ответа и упорствуете в ошибке. Ваш пример на самом деле абсурден насколько же, насколько вот такой: 
function F1(){
    var a = [];
    for (var i=0;i<1000;i++) a.push(i);
}
 
var start = new Date();
for (var i=0;i<1000;i++) F1();
var res1 = (new Date())-start;
 
var b = [];
for (var i=0;i<1000;i++) b.push(i);
function F2(){
    b[i];
}
 
start = new Date();
for (var i=0;i<1000;i++) { F2(); }
var res2 = (new Date())-start;
 
alert([res1,res2]);
 | 
	
		
 Я не спорю, что использование глобальных переменных ускоряет выполнение некоторых конкретных задач. Но в только в общем плане, например использование одного массива несколькими функциями и т.д. Но в каждой конкретной функции вариант с локальными переменными будет работать быстрее. Вот, например: 
	
// Пример с глобальной переменной:
function F1(){
    for (var i=0;i<1000;i++) a.push(i);
}
var start = new Date();
for (var i=0;i<1000;i++) {
    var a = [];
    F1();
};
var res1 = (new Date())-start;
 
 
// Пример с глобальной и локальной переменной:
function F2(){
    var arr = b;
    for (var i=0;i<1000;i++) arr.push(i);
}
 
start = new Date();
for (var i=0;i<1000;i++) {
    var b = [];
    F2();
}
var res2 = (new Date())-start;
 
alert([res1,res2]);
 | 
	
		
 Цитата: 
	
 Вот это я и сказал (если прочтесть ветку сначала). Я привёл конкретную задачу, когда в таблице массивы определялись В ФУНКЦИИ (они были локальными). Я предложил их определние вынести в глобальный контекст (точно такой пример я и привёл). Я не прав? Цитата: 
	
  | 
	
		
 ZoNT, 
	Попробуйте выполнить код из сообщения #47. Он наглядно показывает, что обработка локальных переменных (работа с ними) происходит быстрее в любом конкретном случае. Я понимаю, что вы хотели сказать сначала, но вы прицепились к совершенно верному утверждению, что работа с локальными переменными всегда будет быстрее, чем с глобальными, когда практика (и теория, которую выкладывал Дмитрий) показывает, что это верно. В любом случае обсуждение зашло в тупик, давайте каждый останется при своем личном мнении на счет этого вопроса. Потому что доводы всех высказавшихся в этой теме верны в разных случаях.  | 
	
		
 Ну вы же видите пример, где НЕ ВСЕГДА локальные переменные быстрее... 
	И вот из-за ваших с Дмитрием утверждений люди (как топикстартер) в заблуждении пишут вот такую лабуду...  | 
	
		
 ZoNT, 
	Не всегда работают быстрее чего? Вы понимаете, что для сравнение "быстрее чего работают глобальные переменные" вы подобрали некорректный пример? Вообще, глобальные и локальные переменные используют не потому что одни быстрее других. Просто в разных случаях используются разные подходы. Естественно, что если функция внутри себя каждый раз объявляет одинаковый огромный массив, то это неверно и лучше хранить массив глобально. Тогда будет быстрее работать вызов этой функции. Я не спорю с этим и вы абсолютно правы на этот счет. Тем не менее, работа (изменение, добавление элементов, удаление элементов и т.д.) с локальными переменными происходит быстрее, чем с глобальными.  | 
	
		
 Я этого и не говорил!!! 
	Вот кусок поста: "Сообщение от ZoNT: Быстрее, в некоторых случаях. Dmitry A. Soshnikov: Во всех случаях." Разве я не написал топикстартеру, что: "В данном же случае приходится в функции каждый раз создавать огромный массив. Соответсвенно создать используемые данные всегда лучше 1 раз..." Ключевые слова: "В данном же случае..." Случай есть? Есть! Я его написал? Не я... "Dmitry A. Soshnikov: Во всех случаях." == false, так как этот "Случай есть? Есть!"  | 
	
		
 ZoNT, 
	Мы с вами как глухой со слепым разговариваем. Я вам говорю, что функция будет быстрее работать с локальной переменной, чем с глобальной. А вы мне отвечаете, что функция, которая объявляет в себе огромный локальный массив будет работать медленнее, чем функция работающая с огромным глобальным массивом. Это очевидно. Но с локальной ссылкой на глобальный массив будет работать еще быстрее. Потому что работа с локальными переменными будет быстрее, чем с глобальными.  | 
	
		
 Это тебе очевидно!!! 
	Но форум не твой личный!!! На него заходят нубы и задают вопросы. И им надо разжовывать. Понимаешь? И утверждение "всегда быстрее", как видишь, неверно. Это очевидно...  | 
	
		
 Через нопределённое количество ответов нубам ты поймёшь, что нет ничего невозможного и что такого люди могут понаписать, что категоричный ответ "всегда!!!" окажется неверным... 
	 | 
	
		
 И я в 19(20) лет был таким :) как Андрей (Dmitry) 
	 | 
	
		
 ZoNT, 
	Я рад тому, что вы переросли меня. Я признаю, что ваша точка зрения - правильная. Точка зрения, что в конкретном случае скрипт будет быстрее работать, если функции будут использовать глобальные переменные. Тем не менее, формулировка "код функции всегда работает быстрее с локальными переменными, чем с глобальными" абсолютно верна.  | 
	
		
 Нет, не верна. 
	Тут спорное место - "работает". Это нечёткое определение. И я под ним понимаю и инициализацию (которую я и предложил вынести в глобальный контекст, что повлекло за собой объявление переменной тоже в глобальном контексте). А что под ним понимают другие люди, которые не понимают даже как устроен компьютер? Это знают только сами люди... Надо уметь чётко формулировать не только вопросы, но и ответы. Иначе человек, котрому ты ответил поймёт в меру своей образованности. Сформулируй так, чтобы нельзя было понять иначе (только одно толкование), тогда будешь прав...  | 
	
		
 ZoNT, 
	Договорились, впредь буду аккуратнее с формулировками. Давайте остановимся на том, что код функции будет работать быстрее с локальными переменными, исключая тот случай, когда неоднократно используемая функция в каждый свой вызов инициализирует одинаковую большую локальную переменную.  | 
	
		
 Вот так намного лучше! 
	Если бы эту формулировку топикстартер услышал раньше (а не "всегда быстрее"), он бы такой код не написал бы, и вопрос бы не задал...  | 
	
		
 Андрей Параничев, да, я сразу не заметил, но ZoNT, возможно, просто не знаком с контекстами и не видит, что глобальная переменная для объекта Global (в браузере Global === window) будет (относительно scope'a) играть такую роль же, как локальная переменная в функции. Поэтому, чтобы проводить опыты, чтобы эмпирически подтверждать теорию, надо конкретно, однозначно определить - какие переменные (какого скопа) участвуют в тестах. 
	Цитата: 
	
 
var a = 10; - глобальная переменная
alert(window['a']); // это свойство объекта Global (window)
function test() {
  var c = 20; - локальная переменная
  alert([c, a]);
}
Переменная "c" стала свойством объекта variable object (10.1.3) - этот объект имеется у каждой функции и хранит все локальные переменные, все формальные параметры, а также все декларации функций. Т.е. в нашем случае variable object (далее для сокращения - VO) функции "test" имеет одно свойство "c". Схематично отобразим так: 
VO(test) = {c: 20};
Далее, мы видим alert([c, a]);. Спрашивается, откуда выдается "20,10", если VO(test) не имеет у себя свойства "а"? А дело в scope chain'e (10.1.4) - цепи скопов (variable object'ов, начиная от VO функции и вверх до родительских скопов), которые хранит функция. Это еще один объект (хранится во внутреннем свойстве [[scope]]), который ассоциирован с каждой функцией. Т.е. схематически [[scope]] функции test будет таким: 
[[scope]](test) = {
  VO(Global): {
    a: 10
  },
  VO(test): {
    c: 20;
  }
};
А далее - самое интересное (опять же - смотреть в 10.1.4). При обращении к переменной внутри функции она ищется в скоп-чейне последовательно вверх, начиная от VO самой функции. Все. Больше никаких чудес нет. Поэтому ясно видно, что: alert(c); сработает быстрее, т.к. свойство "c" будет сразу же найдено в первом просматриваемом скопе. Что же касается alert(a): - смотрим в VO(test); - не нашли; - смотрим в VO(Global) - нашли. Два действия против одного (поиск в двух скопах (обращение к глобальной переменной) против моментального нахождения в первом скопе (обращение к локальной переменной)). Есть разница? Ну вот и замечательно. Поэтому, еще раз - обращение из абстрактного локального скопа к глобальной переменной всегда (всегда!) будет медленней, чем обращение к локальной. Точка. P.S.: VO(Global) - это утрированно, на самом деле сам Global уже является variable object'ом для глобальных переменных. P.S.[2]: еще раз (уже зная теорию) смотрите результаты своего же примера: 
<html>
<body>
<script type="text/javascript">
// local var
function F1(){
  var arr = [];
  // здесь идет обращение к *локальной* переменной
  // arr
  for (var i=0;i<1000;i++) arr.push(i);
}
var start = new Date();
for (var i=0;i<1000;i++) F1();
var res1 = (new Date())-start;
//**********************************
// Global var
function F2(){
  for (var i=0;i<1000;i++) arr.push(i);
}
var start = new Date();
var arr = [];
for (var i=0;i<1000;i++) F2();
var res2 = (new Date())-start;
// test 3
var start = new Date();
var arr2 = [];
for (var i=0;i<1000;i++) {
  for (var k=0;k<1000;k++) arr.push(k);
}
var res3 = (new Date())-start;
//**********************************
alert([res1, res2, res3]);
</script>
</body>
</html>
P.S.[3]: ZoNT, я пока закрываю глаза на все твои переходы на личности (в надежде, что мои подробные разъяснения помогут тебе более детально понять, как работает JavaScript), но это последнее предупреждение. Общаться - давай общаться, но рассуждать тут о нубстве и о возрастах, когда ты сам не далеко ушел от нубства в данном конкретном вопросе - это излишне. P.S.[4]: а по поводу выделения памяти каждый раз (вместо уже существующей - не важно - в глобальном контексте, или же в прототипе конструктора, как я отмечал) - это уже другой вопрос совсем. И не зачем подменять понятия, говоря, что работает быстрее - "обращение к локальной или глобальной переменной?". Я и сам отметил (о хранении однотипного объекта в одном месте).  | 
	
		
 Dmitry A. Soshnikov, 
	На самом деле тут все просто. Ты говоришь: код функции будет всегда быстрее работать с локальной переменной, чем с глобальной. Это очевидно. Он говорит: не любой скрипт, где неоднократно вызывается функция использующая локальные переменные, будет работать быстрее, чем тот, в котором функция использует глобальные переменные. И приводит в пример код топикстартера. Тут чисто дурацкие придирки к формулировкам. Тем не менее на вопрос Цитата: 
	
  | 
	
		
 Спасибо за познавательную дискуссию! 
	Изначально я делал переменные для многократно вызываемых функций глобальными, потом решил посмотреть, что будет в случае локальных. Так вот, во втором случае в ФФ и Опере тормозить стало меньше, ну а ИЕ - по барабану. Дело, наверно, в том, что функция обращается к переменным не 1 раз, а 4  | 
	
		
 функция F1 работает медленне (с локальной переменной а) чем F2, так как ей приходится инициализировать свою переменную локально... 
	Никаких "скрипт".  | 
	
		
 ZoNT, ну так и надо говорить о работе каких-то там функций, а не об "обращении к локальным и глобальным переменным". 
	Цитата: 
	
 Цитата: 
	
  | 
	
		
 Залил с глобальными. Что-то разницы не видно 
	 | 
	
		
 А разницу в размере скрипта не увидел??? 
	 | 
	
		
 Цитата: 
	
  | 
	
		
 Вложений: 1 
		
		
		Если интересно, вот тест с локальными/глобальными 
	(там пробег по всем элементам)  | 
	
		
 Мне очень интересно узнать две вещи. 
	Во первых объясните пожалуйста с какой целью http://chem.50webs.com/mendeleev/table.html генерируется полностью Ява скриптом. Во вторых http://chem.50webs.com/mendeleev/table.html использует кодировку UTF-8 и все символы прекрасно отображаются. Но стоит мне своей страничке выставить charset=UTF-8 как напроч перестают отображатся все русские буквы. Вместо них абракадабра. Приходится использовать windows-1251. С чем это связано? P.S. http://chem.50webs.com/mendeleev/table.html Мне очень понравился, появилось желание сверстать нечто подобное.  | 
	
		
 Дело в том, что сгенерированная страница весит около 50 КБ, а кусок скрипта, который её генерит - 15 КБ. 
	Плюс к тому я скоро залью апдейт(осталось чуть-чуть доделать), и некоторые куски контента будут различаться в зависимости от браузера. Зю Ыю что-то не могу войти на форум  | 
	
		
 document.write распиханный по сайту может больно аукнуться при переводе сайта на аякс и баста. 
	 | 
	
		
 Зацените, пожалуйста, апдейт 
	 | 
	
		
 Вау, ты избавился таки от document.write... 
	 | 
	
		
 Ага, а ползунок плющит не по децки... Доработать надо... 
	Если его тащить, вывести мышку за пределы документа и там отпустить кнопку, то ползун так и будет таскаться за мышкой бесконечно...  | 
	
		
 Не смог отделаться от верхней полосы прокруктки, когда ее потащил. А так - все красиво :) 
	 | 
	
		
 круто! 
	 | 
| Часовой пояс GMT +3, время: 03:24. |