javascript эквивалент php $$ доллар доллар
- Я объявил локальную переменную с именем cont в функции с именем validate.
- Я вызываю процесс-функцию изнутри validate.
- Я посылаю строку "продолжение" в качестве аргумента для проверки функции.
- В функции процесса, используя строку 'cont', я хочу получить доступ к значению локальной переменной javascript, например, к окну ['cont']. Но я становлюсь неопределенным.
- Я пытаюсь получить доступ к переменным, таким как $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
являются локальными, все, что не объявлено, является глобальным.
http://www.i-marco.nl/weblog/archive/2007/06/14/variable_variables_in_javascri - обнаружил, что может вам помочь, или
https://stackru.com/questions/592630/javascript-variable-variables
Как и предполагали другие, вы не сможете получить доступ к переменным в локальной области в другом месте вашего кода.
Код, который вы первоначально разместили, был:
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
функция.