【问题标题】:javascript equivalent of php $$ dollar dollarjavascript 相当于 php $$ Dollar 美元
【发布时间】:2011-04-28 13:46:39
【问题描述】:
  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>

然后 casablanca 声明 $GlOBALS 将不包含局部范围变量,这与 javascript 中的方式相同。没错。

【问题讨论】:

    标签: php javascript variable-variables


    【解决方案1】:

    【讨论】:

    • 上面的两个链接似乎都失效了。
    【解决方案2】:

    您的代码是正确的,但您的期望是错误的。 PHP 中的$GLOBALS 包含局部变量,同样的情况也适用于 JavaScript 中的 windowcontvalidate 本地的,所以显然不能从 process 访问。

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

    【讨论】:

    • 啊,是的,我也这么认为。好点。我们不会得到未声明的局部范围变量的错误。我想做的只是为未声明的局部变量赋值。我希望它应该工作。不是吗?
    • 是的,这会起作用,而且您不会收到任何错误。您未声明的任何变量都被假定为全局变量。
    • 好的。谢谢。现在一切都清楚了。然而,对于为这些目的使用额外的全局变量感到很难。
    • 您可以使用单个全局对象来存储参数,而不是使用多个变量。只要在开头定义一个空对象,比如globals = {};,然后就可以用globals['cont']代替cont
    【解决方案3】:

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

    您最初发布的代码是:

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

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

    【讨论】:

      【解决方案4】:
      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 这样的东西,那么你就是这样。此外,只是大声思考其他选择。谢谢。
      • 我在您更新后回答这个问题。我想这样做。请在粗体部分“阅读 Felix King 的更新后更新”下参考我的问题。
      • 啊。在所有这些讨论之后,我已经结束。我要用你的方式。窗口变量。谢谢。一段时间让我们看看其他人的答案,以便我可以使这篇文章更强大。
      【解决方案5】:

      我试图理解为什么需要将变量作为字符串传递以及为什么要通过window 对象访问cont。这就像你期望你的代码做的那样:

      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 函数。

      【讨论】:

      • 我正在尝试在 php 中像 $GLOBALS 一样。我希望它适用于像 php 中的局部变量。不是吗?哦。 $GLOBALS 是否包括本地范围?我已经清楚地说明了这种需要的原因。
      • 我添加了一些代码,用于在已编辑的粗体文本下形成查询字符串。
      • 一方面你的问题在我读到它时非常模棱两可,两个 JavaScript 不是 PHP 所以不要那样对待它:使用 JS 成语和最佳实践,三个你的第三条评论是/没有必要的,而且非常烦人。
      • 另外,我觉得你在问两个问题。
      • 谢谢。评论已删除。我有和你一样的功能。我想知道的唯一选择是将局部变量作为 window['name'] 访问,并且由于局部范围内的变量不被 window 对象引用,我将在 window 对象的帮助下像全局变量一样使用它。无论如何,我认为您会与您的功能交叉检查我的功能,并将采取所需的选项。我的功能在这里vikku.info/codetrash/General.js#MakeParamEx
      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 2011-02-12
      • 2011-07-12
      • 2012-10-23
      • 2011-08-21
      • 2012-08-19
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多