справочная проблема в JavaScript? - PullRequest
1 голос
/ 20 декабря 2010

У меня ниже, вероятно, куча проблем, но давайте упростим их с помощью более простых примеров.

Предположим, есть две переменные, a=cat и b=a, и вы хотите сослаться на значение b s a к этой переменной, т.е. a.Так по какой команде я могу это сделать?Переменная SomeCommand(b) и переменная a должны указывать на одно и то же пространство памяти, поскольку b оценивается как a.Тот же вопрос возникает из приведенного ниже кода, где у нас есть часть document.getElementById(vals[0].split('|')[0]).style.display= 'block';, которая должна быть оценена как document.getElementById(picture).style.display= 'block';, т. Е. Чтобы показать рисунок, но приведенный выше пример гораздо понятнее, поэтому обратитесь к нему, пожалуйста.Как сделать ссылку?Два пути выше эквивалентны?Я здесь бдительный, потому что столкнулся с похожими проблемами в других языках, но тогда они касались inode, символьных / жестких ссылок и тому подобного, но не представляли, как это работает в JS.Вкратце, как их оценивают?


function change_visibility(binX)

{
     // binX is a thing that matches `/^[10Xx]+$/`
     // 1 = show the thing
     // 0 = do not show the thing
     // x/X = do not do anything
     //
     // for example, 00011x would turn OFF picture-quote-question_mark 
     // while turning ON search and help but not doing anything to 
     // typing pad's current state


        var vals = ['picture|binX.charAt(0)',
                        'quote|binX.charAt(1)',
                        'question_mark|binX.charAt(2)',
                        'search|binX.charAt(3)',
                        'help|binX.charAt(4)',
                        'typingPad|binX.charAt(5)'
                        ];

        for (var i=0; i<vals.length; i++)
        {
                if(vals[i].split('|')[1]==1)
                {
                        //TODO: check whether you can do it like this, 
                        // assumed for example that vals[0].split('|')[0] =picture
                        // but it is not, the "inode" or let call it arrow is diffent!
                        // ERROR HERE ?!?
                        document.getElementById(vals[i].split('|')[0]).style.display= 'block';
                }
                else if(vals[i].split('|')[1]==0)
                {
                        document.getElementById(vals[i].split('|')[0]).style.display= 'none';
                }
        }

}

Пожалуйста, исправьте ярлыки, если вы знаете больше описательных альтернатив.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Переменные в JavaScript не содержат значений, они ссылаются на них.Когда вы делаете var a = [];, происходят две вещи:

  1. В памяти выделяется пустой объект массива, и
  2. Ссылка на этот объект массива помещается в переменную a.

(Это на самом деле не относится к распределению времени анализа по сравнению с распределением оценки, но об этом достаточно просто подумать.)

Если вы затем выполните var b = a;, массив НЕ копируется;другая ссылка на тот же массив помещается в переменную b.

Оборачивая ее:

var a = [];
var b = a;
b.push(42);
console.log(a);
//-> [42]

Они одинаковы.Вы не можете вызвать ситуацию, когда изменение 'b' приведет к тому, что 'a' будет ссылаться на другой объект.

Каждая "глобальная переменная" на самом деле является именованным свойством глобального объекта.В веб-браузерах объект window является глобальным.Объедините это с тем фактом, что доступ к свойству всегда можно получить с помощью точечной нотации (например, foo.bar) или скобочной нотации (например, foo["bar"]), и вы можете искать любую глобальную переменную по имени.Например:

a1 = 42;
a2 = 17;
var b = "a1";
console.log( window[b] ); //42
b = "a2";
window[b] = 999;
console.log( a2 ); // 999

То же самое не верно для локальных переменных.В отличие от некоторых языков (например, Io ) у вас нет доступа к хранению объекта и разрешению перечисления или косвенного доступа ко всем локальным переменным.Для такой ситуации вам нужен собственный объект:

var variables = {
  a1 : 42,
  a2 : 17
};

var b = "a1";
console.log( variables[b] );
// -> 42
0 голосов
/ 20 декабря 2010

Возможно, вы захотите пересмотреть свой вопрос.Я не совсем уверен, что вы спрашиваете.Есть ли проблема с этим кодом, который вы не можете выяснить?Что это должно делать?Целая ссылочная часть беседы a, b не имеет никакого отношения к предоставленному вами коду.Переменная, которую вы передаете, не используется в вашем коде.Также ваш оператор if сравнивает разбиение с == 1. Но оно никогда не будет равно 1 или 0. Это будет только одна из тех фраз справа от '|'.В любом случае, возможно, вы сможете пересмотреть свой вопрос, и это будет иметь больше смысла.

Позвольте мне немного переписать ваш код, чтобы у вас не было этого мусора binX в массиве.

function change_visibility(binX) {

var vals = ['picture',
                'quote',
                'question_mark',
                'search',
                'help',
                'typingPad'
                ];

for (var i=0; i<vals.length; i++) {
        var val = binX.charAt(i);

        if(val=='1') {
           document.getElementById(vals[i]).style.display= 'block';
        } else if(val=='0') {
           document.getElementById(vals[i]).style.display= 'none';
        }
}
}

Этовозможно, было то, что вы были после.Таким образом, если binX равен «10000», то будет отображаться «изображение», а остальное будет скрыто.Может быть, это то, что вы были после.Это решение лучше, потому что вы не используете eval (), которого вам следует избегать, если вам не нужно, и этого кода вам не нужно.

...