Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопросы по оптимизации (https://javascript.ru/forum/misc/4051-voprosy-po-optimizacii.html)

hp5741 18.06.2009 07:54

Вопросы по оптимизации
 
Здравствуйте.
1. Возник вопрос если я выполняю get_array(array); то передается сам массив или ссылка на него?
var array = [1,2,3];
function get_array(a) {
    alert(a[0]);
}
get_array(array);

ответ: По ссылке
2. Как мне лучше использовать document.getElementById();?
в начале скрипта создать переменную с глобальной областью видимости и потом использовать внутри функций?
dom_link = document.getElementById('mydiv');
function my_alert() {
     alert(dom_link.width);
}
function my_alert2() {
     alert(dom_link.height);
}

или в каждой функции создавать новый var с ссылкой или может есть какий то другой варианты?
ответ:
var dom_link = document.getElementById('mydiv');
function my_alert() {
     alert(dom_link.width);
}

3.Есть 2 массива и в функции нужно выбрать какой использовать, не понимаю как правильно это сделать с стороны производительности ?
array1 = [];
array2 = [];
array1.push(1,2,3);
array2.push(4,5,6);
function set_array() {
....
if(i == 1) {
    var g = array1;
}else{
    var g = array2;
}
alert(g[0]);
}

ответ:
var array1 = [1,2,3];
var array2 = [4,5,6];
function set_array() {
....
var g = i == 1 ? array1 : array2;
alert(g[0]);
}

Заранее благодарю тех кто поможет.

Большой Респект за:

var $d = document;
$d.byId = $d.getElementById;

var $ = function(elem/* id */) {
    return typeof elem == 'string' ? document.getElementById(elem) : elem;
};

var g = i == 1 ? array1 : array2;

Riim 18.06.2009 07:57

Цитата:

Сообщение от hp5741
то передается сам массив или ссылка на него?

ссылка.

Цитата:

Сообщение от hp5741
elementGetById

нет такого метода.

hp5741 18.06.2009 08:10

поправил getElementById

Riim 18.06.2009 09:43

Цитата:

Сообщение от hp5741
в начале скрипта создать переменную с глобальной областью видимости и потом использовать внутри функций?

Цитата:

Сообщение от hp5741
или в каждой функции создавать новый var с ссылкой

Распространенная ошибка. Запись "var dom_link = document.getElementById;", равносильна записи "window.dom_link = document.getElementById;"
Внутри метода, this, ссылается на область, из которой он (метод) вызывается. Теперь this будет ссылаться не на document, а на window. Если при этом, внутри метода, this как-либо используется, то метод может сработать не верно. Если нужно сократить запись, то лучше так:
var $d = document;
$d.byId = $d.getElementById;

Теперь вместо document.getElementById можно писать $d.byId .

Так же хороший вариант создать функцию:
var $ = function(elem/* id */) {
	return typeof elem == 'string' ? document.getElementById(elem) : elem;
};


Цитата:

Сообщение от hp5741
как правильно это сделать с стороны производительности

Со стороны производительности лучше вот это:
array1 = [];
array2 = [];
array1.push(1,2,3);
array2.push(4,5,6);


заменить на:
array1 = [1, 2, 3];
array2 = [4, 5, 6];

И var-ы где надо добавить. Остальное нормально.

hp5741 18.06.2009 10:31

Щикарненько

Kolyaj 18.06.2009 10:38

Цитата:

Сообщение от hp5741
передается сам массив или ссылка на него?

Бессмысленный вопрос. Может хотели спросить "копия массива или ссылка на него"?

Цитата:

Сообщение от hp5741
Как мне лучше использовать document.getElementById();?
в начале скрипта создать переменную с глобальной областью видимости и потом использовать внутри функций?

Зависит от ситуации. Если у вас один и тот же DOM-элемент повсеместно используется, то имеет смысл единожды получить ссылку на него.
Цитата:

Сообщение от Riim
Распространенная ошибка.

А ошибка-то в чем?

Цитата:

Сообщение от hp5741
не понимаю как правильно это сделать

var g = i == 1 ? array1 : array2;

Riim 18.06.2009 10:42

Цитата:

Сообщение от Kolyaj
А ошибка-то в чем?

Так я же описал там.

Цитата:

Сообщение от Kolyaj
var g = i == 1 ? array1 : array2;

Речь была о производительности, а не о объеме кода. Хотя может и это пригодится.

Kolyaj 18.06.2009 10:45

Цитата:

Сообщение от Riim
Так я же описал там.

Там что-то про this. А при чем здесь this?

Цитата:

Сообщение от Riim
Речь была о производительности, а не о объеме кода.

Какая нафиг производительность в одном if и двух присваиваниях?

Riim 18.06.2009 10:50

Цитата:

Сообщение от Kolyaj
Там что-то про this. А при чем здесь this?

Для некоторых видимо не причем.

Цитата:

Сообщение от Kolyaj
Какая нафиг производительность в одном if и двух присваиваниях?

Я не знаю. Это вы пытаетесь увеличить производительность (именно об этом ТС просил) заменой конструкции:
if(i == 1) {
    var g = array1;
}else{
    var g = array2;
}

на конструкцию:
var g = i == 1 ? array1 : array2;

hp5741 18.06.2009 10:56

Если я правильно понял то вместо этого

dom_link = document.getElementById('mydiv');
function my_alert() {
     alert(dom_link.width);
}

нужно писать
var dom_link = document.getElementById('mydiv');
function my_alert() {
     alert(window.dom_link.width);
}

Kolyaj 18.06.2009 10:58

Цитата:

Сообщение от Riim
Для некоторых видимо не причем.

К чему эти уклончивые понты? Объясните дураку.

Я специально не взял в цитату слово производительность, а привел более удобную в данном случае запись.


hp5741,
в данном случае получится то же самое, но var всегда лучше писать. И window лишний.

Riim 18.06.2009 10:59

Цитата:

Сообщение от Kolyaj
К чему эти уклончивые понты? Объясните дураку.

Kolyaj,
Странно, раньше в ТС вроде вместо "dom_link = document.getElementById('mydiv');" было "dom_link = document.getElementById" .
Вот я и подумал, что ТС, просто хочет сократить запись конструкции document.getElementById . Потому и туплю. В таком случае this здесь действительно не причем.

Цитата:

Сообщение от Kolyaj
Я специально не взял в цитату слово производительность, а привел более удобную в данном случае запись.

Тогда согласен. Так действительно удобней.

Kolyaj 18.06.2009 11:02

Riim,
понятно.

hp5741 18.06.2009 12:42

Просто после твоего поста прочитал про window и там было написано что сначало js ищет переменную в локальной области видимости потом в ниже лежащей и так пока не найдет так что если много вложений функций то будет галяк по этому и window как я понял
var array1 = [1,2,3];
var array2 = [4,5,6];
function set_array() {
....
var g = i == 1 ? window.array1 : window.array2;
alert(g[0]);
}

hp5741 01.07.2009 13:20

var g = i == 1 ? window.array1 : window.array2;

бл@ тут косяк при использовании window.array1 идет обращение к DOM а это накладно.

Kolyaj 01.07.2009 14:55

Во-первых, без запятых ваше сообщение не сразу допрешь, как читать. Во-вторых, window -- это не DOM.

Dmitry A. Soshnikov 01.07.2009 16:06

Цитата:

Сообщение от hp5741
array1 = []; array2 = []; array1.push(1,2,3); array2.push(4,5,6); function set_array() { .... if(i == 1) { var g = array1; }else{ var g = array2; } alert(g[0]); }

если array1 и array2 - глобальные, то можно получить через window:

var g = window['array' + i];


естественно, переменная i должна быть 1 или 2 в данном случае.

hp5741 01.07.2009 22:53

var g = window['array' + i];

а где про такие конструкции по подробней узнать можно?

x-yuri 02.07.2009 15:20

http://javascript.ru/ecma/part11#a-11.2.1


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