javascript相当于php $$美元

时间:2010-10-21 11:46:23

标签: php javascript variable-variables

  1. 我在名为validate。
  2. 的函数中声明了一个名为cont的局部变量
  3. 我在验证内部调用函数进程。
  4. 我发送字符串'cont'作为验证函数的参数。
  5. 在使用字符串'cont'的过程函数中,我想访问javascript局部变量的值,如window ['cont']。但我得到了不确定。
  6. 我想要做的是尝试访问php或$$中的$ GLOBALS等变量。
  7. 以下是我所做的一个例子。

    <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并将其替换为窗口变量,如window [cont]。 cont将有字符串'cont'。

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

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

    的javascript

    被修改

    代码的一部分,我提取内部的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>
    

    然后casablanca表示$ glOBALS不会包含本地范围变量,这在javascript中是相同的。那是对的。

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

您的代码是正确的,但您所期望的是错误的。 PHP中的$GLOBALS 包含局部变量,同样的事情适用于JavaScript中的windowcont位于validate的本地,因此显然无法从process访问。

在PHP中,您需要在函数内显式声明变量为全局变量。在JavaScript中,它以相反的方式工作:使用var声明的任何变量都是本地的,声明的任何变量都是全局的。

答案 2 :(得分:2)

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

您最初发布的代码是:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我试图了解为什么需要将变量作为字符串传递,以及为什么要通过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() - esque变量引用。例如,您可以像这样实现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函数中。