2016-01-29 3 views
0

Почему оленья кожа этой работы:Получение длины массива с помощью функции eval()?

var problem_0 = ["a","b","c","d"]; 
arrayname = "problem_0"; 
arraylength = eval([arrayname]).length; 
for (i = 0; i < arraylength; i++) { 

Я пытаюсь получить различные массивы в зависимости от того, что пользователь нажимает на, так что мне нужен ИмяМассива быть строка, строка можно изменять ширину коды. eval ([arrayname]). length возвращает «1». Зачем?

+0

Поскольку 'eval' возвращает этот массив:' ["problem_0"] '. Во всяком случае, переменные не предназначены для динамической передачи. Узнайте, как использовать объект и его свойства. – Teemu

+0

@Teemu На самом деле, динамически создаваемые переменные, разумеется, должны быть созданы. Для этого вам просто нужно использовать обозначение массива. Например, это не сработает: var x = 10; var someObject = new Object(); someObject.x + 1 = "Имя свойства 11 было просто установлено"; но это будет: var x = 10; var someObject = new Object(); someObject [x + 1] = "Имя свойства 11 только что было установлено"; https://jsfiddle.net/q86hd0o0/ –

+0

@ScottMarcus Пожалуйста, перечитайте мой комментарий: «переменные не должны быть динамически _referred_». Вы говорите о свойствах объекта, которые полностью отличаются от переменных. – Teemu

ответ

0

Не нужно использовать eval, если массив имеет глобальный охват.

var problem_0 = ["a","b","c","d"]; 
arrayname = "problem_0"; 
alert(window[arrayname].length); 

вы также можете использовать this

var a = [1,2]; 
var b = "a"; 
alert(this[b].length); //outputs 2 
+0

Спасибо. Я не полностью понимаю окно, но должен прочитать, когда использовать eval и когда использовать окно :-) – Carl

+0

Хотя eval() является частью языка JavaScript, его использование сильно обескуражено. В действительности нет никаких проблем, требующих eval как решения. Использование eval открывает дыры безопасности в приложении, а также вводит новую область (контекст выполнения) в стек выполнения. Есть много частей JS, которых следует избегать, и этот находится в верхней части списка. window - это просто глобальный объект в веб-браузере - все зависит от его глобального масштаба. Когда люди говорят о глобальном в браузере, они говорят о объекте окна. –

+0

@ gurvinder372 Это действительно не жизнеспособное решение, так как ничего не должно быть в глобальном масштабе. –

0

Eval() ЗЛО и не должны использоваться. Почему бы вам просто не передать массив в вопросе функции, которая получает ее в качестве аргумента. Тогда эта функция может проверять длину переданного массива через имя аргумента? Задача решена.

var a1 = [0,1,2,3,4,5]; 
var a2 = [0,1,2,3]; 
var a3 = [0,1,]; 

function getArrayLength(a){ 
    return a.length; 
} 

getArrayLength(a1); 
getArrayLength(a2); 
getArrayLength(a3); 

https://jsfiddle.net/h6ehu5cc/

Но, прямой ответ на вопрос о том, почему ваш код не работает, потому что вы писали: eval([arrayname]).length, которая принимает строку и превращает его в массив символов в имя массива (["P","r","o","b","l","e","m","_","0"]), когда вы должны были написать: eval(arrayname).length, который будет оценивать имя строки в ссылке на объект, а затем будет возвращаться длина членов этого объекта.

Следующий код показывает, как ваша Eval версия должна работать, но опять же, я только показывая его, так что вы можете увидеть, что вы сделали, не используйте Eval в вашем решении для реальной, хотя:

var problem_0 = ["a","b","c","d"]; 
arrayStringName = "problem_0"; 
arrayObjectName = eval(arrayStringName); 
arraylength = arrayObjectName.length; 
for (i = 0; i < arraylength; i++) { 
    alert(arrayObjectName[i]); 
} 

https://jsfiddle.net/9n9552oe/

0

Вам не нужно использовать eval - хотя это не совсем зло, в мире всего три человека, которые полностью понимают, как это работает. (И один из них забыл ...)

За последние десять лет программирования javascript мне никогда не приходилось его использовать - доступны другие методы.

Как видно из предыдущих ответов, в этом примере оно не нужно.

+0

eval ЗЛО. На самом деле это хорошо понимают многие разработчики, но большинство разработчиков не понимает, как решить свои проблемы без него, поэтому они просто задерживают дыхание и используют его в любом случае. eval() открывает потенциальные дыры в безопасности и вводит новые возможности, когда (как вы говорите) нет проблем, которые не могут быть решены без него. –

+0

Скотт - Спасибо за ваши превосходные знания - я не знал о проблемах безопасности - вы, безусловно, один из трех, которые ПОЛНОСТЬЮ понимают. Я знаю только, что мне это никогда не понадобилось ... –

Смежные вопросы