javascript эквивалент php $$ доллар доллар

  1. Я объявил локальную переменную с именем cont в функции с именем validate.
  2. Я вызываю процесс-функцию изнутри validate.
  3. Я посылаю строку "продолжение" в качестве аргумента для проверки функции.
  4. В функции процесса, используя строку 'cont', я хочу получить доступ к значению локальной переменной javascript, например, к окну ['cont']. Но я становлюсь неопределенным.
  5. Я пытаюсь получить доступ к переменным, таким как $GLOBALS в php или $$.

Вот пример того, что я сделал.

<script>

function process(str)
{
   alert(window[str]);
}

function validate()
{
   var cont='once there lived a king named midas';
   process('cont')
}

validate();

</script>

Причина в том, что я делаю большинство форм как ajax. Я не хочу, чтобы сделать строку запроса, как это.

var param = "command=insert&content=" + encodeURIComponent(cont);

я хочу сделать так

var param = makeParam('command,[insert],content,(cont)');

в makeparam я использую регулярное выражение для извлечения пар ключ-значение. поэтому я получаю строку cont из (cont) и подставляю ее в переменную окна, например window[cont]. продолжение будет иметь строку 'продолжение'.

Итак, как мы можем получить содержимое переменной, используя имя переменной в качестве строки?

поэтому я ищу javascript эквивалент php's $$

отредактированный

часть кода, где я извлекаю cont, который находится внутри (cont), что означает, что я хочу содержимое строки между ().

nxt = str[i+1].match(/\((.*)\)$/)

if(nxt)param += '=' + encodeURIComponent(window[nxt[1]]);

содержание параметра будет

"command=insert&content=once there lived a king"
// assume that once there lived a king is encoded

Редактировать. Заметка 2.

После нескольких ответов я редактирую код, чтобы добавить это.

Я пытаюсь сделать как $GLOBALS в php.

Я не пробовал, может ли $GLOBALS содержать локальные переменные.

и узнал, что локальная область не войдет в $GLOBALS.


Обновление после прочтения Обновления Феликса Кинга.

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

var param = makeParam('command,insert,/title/,/keywords/,/description/,mode,[1],fckcontent,(cont)');

// if it is a text without // or () then the it is a straight key value pair. so i will do comment=insert.

//if it is /title/ then the key is title and its value is an input elements value with id as title so title=getElementById('title')

//if it is mode,[1] then mode is the key and 1 is its direct value//

//if it is fckcontent,(cont) then fckcontent is the key and cont is a javascript local variable which will contain html content from a WYSIWYG editor.

// a sample result will be

 var param = "command=insert&keywords=somekeywords&description=somedescription&mode=1&fckcontent=<p>once there lived a king<p>

а затем Касабланка заявил, что $GlOBALS не будет содержать локальные переменные области видимости, и это то же самое в javascript. вот так.

5 ответов

Решение
function validate()
{
   var cont='once there lived a king named midas';
   process('cont')
}

cont определяется в локальной области функции, а не в глобальной области. Либо просто

cont='once there lived a king named midas';

(без var) или же

window.cont='once there lived a king named midas';

Обновить:

Но почему вы хотите пережить столько проблем с разбором строк? Почему бы тебе не сделать:

var param = makeParam({command: 'insert', content: encodeURIComponent(cont)});

Ваш код верен, но то, что вы ожидаете, неверно. $GLOBALS в PHP не включает локальные переменные, и то же самое относится и к window в JavaScript. cont является локальным для validateпоэтому очевидно, что к нему нельзя получить доступ из process,

В PHP вам нужно явно объявить переменную как глобальную внутри функции. В JavaScript это работает наоборот: любые переменные, объявленные с использованием var являются локальными, все, что не объявлено, является глобальным.

Как и предполагали другие, вы не сможете получить доступ к переменным в локальной области в другом месте вашего кода.

Код, который вы первоначально разместили, был:

function process(str) {
    alert(window[str]); // This will alert 'once there lived a king named midas'
} 

function validate() {
    var cont = 'once there lived a king named midas';
    process('cont'); 
}

validate();

Другой вариант (вместо того, чтобы помещать все в карту переменных "окна"), это создать свою собственную карту.

Таким образом, ваш код станет:

var variables = { }

function process(str) {
    alert(variables[str]); // This will alert 'once there lived a king named midas'
}

function validate() {
    variables['cont'] = 'once there lived a king named midas';
    process('cont');
}

validate();

Все это делает создание глобальной карты, которую вы можете добавлять и индексировать, используя строки.

Я пытаюсь понять, почему вам нужно передать переменную в виде строки и почему вы хотите получить доступ cont через window объект. Это делает то, что вы ожидали, что ваш код будет делать:

process = function (str) {
    alert(str); // This will alert 'once there lived a king named midas'
}

validate = function () {
    var cont = 'once there lived a king named midas';
    process(cont);
}

validate();

К вашему сведению: объявлять глобальные переменные обычно считается плохой практикой, особенно в таком случае, когда они вам не нужны. (Хотя я мог бы ошибаться; я не совсем уверен, чего вы пытаетесь достичь)

Изменить: я бы предложил использовать некоторые функции и передавать некоторые переменные, а не возиться с eval()ссылки на переменные. Например, вы могли бы реализовать makeParam вот так:

var cont = 'Boggis, Bunce, and Bean.',
    makeParam = function(str) {
        var param = '',
            i = 0,
            arg = str.split(','),
            l = arg.length;
        while (i < l) {
            if (arg[i + 1].match(/\([a-zA-Z]+\)/)) { // No reason to capture
                param += [arg[1], cont].join('=');
                i += 2;
            } else if (arg[i].match(/\/[a-zA-Z]+\//)) { // No reason to capture
                param += [
                    arg[i], 
                    document.getElementById(arg[i]).value
                ].join('=');
                i += 1;
            } else {
                param += [arg[i], arg[i + 1]].join('=');
                i += 2;
            }
            param += (i + 1 === l) ? '' : '&';
        }
        return param;
    };
param = makeParam('command,insert,/title/,/keywords/,/description/,mode,[1],fckcontent, (cont)');
param === 'command=insert&\
         keywords=somekeywords&\
         description=somedescription&\
         mode=1&\
         fckcontent=Boggis, Bunce, and Bean.';

Но вы, вероятно, хотели бы пройти cont в ваш makeParam функция.

Другие вопросы по тегам