Javascript eval множество променливи не работи

Получих масив, който итерирам и се опитвам да създам променлива.

Името на променливата е променлива и идва от масива. Така че използвам eval (този код ще се използва само на моя локален компютър), за да създам променливите. Колкото и да е странно, мога да създам променлива и да добавя обикновен текст към нейното съдържание. Но когато се опитам да задам променлива променлива, не получавам нищо.

Също така използвам Prototype за лесно преминаване в DOM.

var arr_entries = some_DOM_element;

arr_entries_array = new Array();
arr_entries_array[0] = new Array();
arr_entries_array[0][0] = 'name_dd';
arr_entries_array[0][1] = arr_entries.next(13).down().next(1).innerHTML;

arr_entries_array[1] = new Array();
arr_entries_array[1][0] = 'name_pl';
arr_entries_array[1][1] = arr_entries.next(14).down().next().innerHTML;

arr_entries_array[2] = new Array();
arr_entries_array[2][0] = 'name_pm';
arr_entries_array[2][1] = arr_entries.next(15).down().next().innerHTML;

arr_entries_array[3] = new Array();
arr_entries_array[3][0] = 'name_hd';
arr_entries_array[3][1] = arr_entries.next(17).down().next().innerHTML;

arr_entries_array[4] = new Array();
arr_entries_array[4][0] = 'name_sr';
arr_entries_array[4][1] = arr_entries.next(16).down().next().innerHTML;

for(e = 0; e < arr_entries_array.length; e++)
{
    eval('var arr_entry_' + arr_entries_array[e][0] + ';');

    eval('arr_entry_' + arr_entries_array[e][0] + ' = \'' + arr_entries_array[e][1] + '\';');
}

Мога да предупреждавам (arr_entries_array[e][1]) добре. Мога също да го заменя с обикновен текст, да предупредя променливата след това и тя ще работи.

Вторият ред за оценка е мястото, където се обърка, някакви коментари?


person richard    schedule 07.11.2009    source източник


Отговори (3)


В зависимост от това какви са вътрешните HTML стойности на тези Dom елементи, може да получавате синтактични грешки в eval.

Опитайте да използвате firebug или някакъв друг инструмент за отстраняване на грешки, за да разберете какво съобщение за грешка идва от втория eval и вероятно ще намерите своя виновник.

Парите ми са на нови линии (\n), което е проблемът.

За да коригирате проблема, трябва правилно да избягвате стойностите, които се предават в eval, така че те да са буквални низове, които изглежда да ги използвате като вътре в оператора eval. напр.

var text = "' quotes can be tricky"
eval("var variable = '" + text + "';"); //syntax error
eval("var variable = '" + text.replace(/'/g, "\'") + "';"); //works
var text2 = "\n new lines also"; //this may not be 100% correct, you get the idea
eval("var variable = '" + text2 + "';"); //another syntax error
eval("var variable = '" + text2.replace(/\n/g, "\\n") + "';"); //works
person barkmadley    schedule 07.11.2009
comment
Благодаря! Изглежда това беше проблемът. - person richard; 07.11.2009

Защо просто не зададете свойства на Object?

Ако установите, че пишете код във вашия код и след това го изпълнявате с eval(), почти сигурно не правите нещата правилно. Той е бавен, труден за четене и въвежда дупки в сигурността.

JavaScript обектите могат да имат каквито пожелаете свойства. Защо не само v = new Object(); v['name_dd'] = whatever...; или нещо подобно?

person DigitalRoss    schedule 07.11.2009
comment
Изглежда не мога да намеря правилния начин за прилагане на това в примера. Откривам, че създавам масиви и правя абсолютно същото с обекти. Все още трябва да създам името на променливата, някакви съвети? - person richard; 09.11.2009
comment
Но защо трябва да създавате променлива с ново име? Ако кажа dynamic_vars = new Object();, тогава как динамично създаденото newname е по-добро от простото използване на dynamic_vars["newname"]? - person DigitalRoss; 09.11.2009

Препоръчвам ви да намерите друг метод. Въпреки че изпълнявате кода само на собствения си компютър и не излагате нарушения на сигурността, от eval до публичния eval все още е дефектен и изключително неефективен. Препоръчвам ви никога да не използвате eval, защото може да бъде непредвидимо и защото всяко друго решение вероятно ще бъде по-ефективно за обработка.

person Community    schedule 07.11.2009