javascript эквивалент php $$ доллар доллар - PullRequest
1 голос
/ 21 октября 2010
  1. Я объявил локальную переменную с именем cont в функции с именем validate.
  2. Я вызываю процесс функции изнутри validate.
  3. Я отправляю строку 'cont'в качестве аргумента для проверки функции.
  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$$

Отредактировано

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

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

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

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

"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 ]

2 голосов
/ 22 октября 2010

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

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

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();

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

2 голосов
/ 22 октября 2010

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

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

2 голосов
/ 21 октября 2010
1 голос
/ 21 октября 2010
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)});
0 голосов
/ 21 октября 2010

Я пытаюсь понять, почему вам нужно передать переменную в виде строки и почему вы хотите получить доступ к 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 функцию.

...