JavaScript 相当于 PHP $$ 美元

javascript equivalent of php $$ dollar dollar

提问人:Jayapal Chandran 提问时间:10/21/2010 最后编辑:BoltClockJayapal Chandran 更新时间:10/22/2010 访问量:1568

问:

  1. 我在一个名为 validate 的函数中声明了一个名为 cont 的局部变量。
  2. 我正在从内部调用函数进程 validate。
  3. 我正在发送字符串“cont”作为参数来验证函数。
  4. 在使用字符串“cont”的进程函数中,我想访问javascript局部变量的值,例如window['cont']。但是我没有定义。
  5. 我正在尝试做的是尝试访问 php 中的 $GLOBALS 或 $$ 等变量。

这是我所做的事情的一个例子。

<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]。cont 将具有字符串“cont”。

那么我们如何通过使用变量的名称作为字符串来获取变量的内容呢?

所以我正在寻找相当于 PHP 的 $$ 的 JavaScript

编辑

我提取 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.

在几个响应之后,我正在编辑代码以添加它。

我正在尝试像 php 中的$GLOBALS一样。

我还没有尝试过$GLOBALS是否也可以保留局部变量。

并了解到本地范围不会进入$GLOBALS。


阅读 Felix King 的更新后更新。

我想使用一个函数来构造一个尽可能简单的查询字符串。如下所示。

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 中也是如此。没错。

php javascript 变量

评论


答:

2赞 Alex 10/21/2010 #1

http://www.i-marco.nl/weblog/archive/2007/06/14/variable_variables_in_javascri - 发现,这可能对您有所帮助,或者

https://stackoverflow.com/questions/592630/javascript-variable-variables

评论

0赞 LWurm 4/17/2015
上面的两个链接似乎都死了。
1赞 Felix Kling 10/21/2010 #2
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赞 Jayapal Chandran 10/22/2010
是的,我们可以像您一样使用它,而不是将其用作全局变量。好。不过,还有其他替代方案吗?即使我在想像$GLOBALS这样的事情,那么你的方式就是这样。此外,只是大声思考其他选择。谢谢。
0赞 Jayapal Chandran 10/22/2010
我在您更新后回答这个问题。我想这样做。请在粗体部分“阅读 Felix King 的更新后更新”下引用我的问题。
0赞 Jayapal Chandran 10/22/2010
啊。在所有这些讨论之后,我总结了。我要用你的方式。window.variable。谢谢。一段时间后,让我们看看其他人的答案,这样我就可以使这篇文章更强大。
0赞 xj9 10/21/2010 #3

我试图理解为什么您需要将变量作为字符串传递,以及为什么要通过对象访问。这看起来像您期望的代码执行以下操作:contwindow

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

仅供参考:声明全局变量通常被认为是不好的做法,尤其是在这样的情况下,您似乎不需要它们。(不过,我可能错了;我不完全确定你想完成什么)

编辑:我建议使用一些函数并传递一些变量,而不是用-esque变量引用来搞砸。例如,您可以像这样实现: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.';

但你可能想传入你的函数。contmakeParam

评论

0赞 Jayapal Chandran 10/22/2010
我正在尝试像 PHP 中的$GLOBALS一样做。我希望它适用于像 PHP 这样的局部变量。不是吗?哦。$GLOBALS是否包括本地范围?我已经清楚地说明了这种需要的原因。
0赞 Jayapal Chandran 10/22/2010
我添加了一些代码,用于在粗体文本 Edited 下形成查询字符串。
0赞 xj9 10/22/2010
首先,当我读到它时,你的问题非常模棱两可,两个 JavaScript 不是 PHP,所以不要这样对待它:使用 JS 习语和最佳实践,第三个你的第三个评论是不必要的,非常烦人。
0赞 xj9 10/22/2010
另外,我觉得你在问两个问题。
0赞 Jayapal Chandran 10/22/2010
谢谢。评论已删除。我的职能和你一样。我想知道的唯一选择是以 window['name'] 的形式访问局部变量,并且由于 Window 对象不引用局部范围内的变量,我将借助 Window 对象将其用作全局变量。无论如何,我认为我会将我的功能与您的功能进行交叉检查,并采取所需的选项。我的功能在这里 vikku.info/codetrash/General.js#MakeParamEx
2赞 casablanca 10/22/2010 #4

你的代码是正确的,但你期望的是错误的。 在 PHP 中不包括局部变量,同样的事情也适用于 JavaScript。 是本地的,所以显然不能从 访问。$GLOBALSwindowcontvalidateprocess

在 PHP 中,您需要在函数中显式声明变量为 global。在 JavaScript 中,它的工作方式正好相反:任何声明的变量都是局部的,任何声明的变量都是全局的。var

评论

0赞 Jayapal Chandran 10/22/2010
啊,是的,我也是这样假设的。不错。我们不会因为未声明的局部范围变量而出现错误。我想做的只是为未声明的局部变量赋值。我希望它应该起作用。不是吗?
1赞 casablanca 10/22/2010
是的,这将起作用,并且您不会收到任何错误。任何未声明的变量都假定为全局变量。
0赞 Jayapal Chandran 10/22/2010
还行。谢谢。现在一切都清楚了。然而,对于使用额外的全局变量来实现这些目的,我很难感觉到。
0赞 casablanca 10/22/2010
您可以使用单个全局对象来存储参数,而不是多个变量。只需在开头定义一个空对象,比如 ,然后就可以使用 代替 .globals = {};globals['cont']cont
2赞 David_001 10/22/2010 #5

正如其他人所建议的那样,您将无法访问代码中其他地方的本地范围内的变量。

您最初发布的代码是:

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

所有这一切都是创建一个全局映射,您可以使用字符串添加和索引该映射。