【问题标题】:Dynamic Javascript - Is This Valid?动态 Javascript - 这有效吗?
【发布时间】:2011-10-02 10:18:25
【问题描述】:

谁能告诉我这是否是有效的javascript?我知道你不能在 c# 中做这种事情,但 js 是一种更宽松的语言..

var arrayToUse = "arr" + sender.value;
for (i = 0; i <= arrayToUse.length; i++) {
    // something..
}

具体来说——数组名的动态生成..

更新..

所以我有一个名为 arrMyArray 的数组,它在文档准备就绪时被初始化。 sender.value = "MyArray" - 但也可以是其他东西,例如 MyArray2

我想动态迭代由 sender.value 值指示的数组。

【问题讨论】:

  • 什么是sender.value"arr" + sender.value 分配在哪里?
  • 它只是从控件传递的一串文本。
  • 嗯...arrayToUse 将是一个字符串,arrayToUse.length 为您提供字符串的长度。 arrayToUse 不会神奇地成为一个数组。
  • 是的,这是有道理的。那么有什么方法可以根据其字符串名称获取数组吗?
  • @Mrchief:你不需要使用 eval。只需使用window['arr' + sender.value]

标签: javascript dynamic strong-typing loose-typing


【解决方案1】:

是的,这是完全有效的。

arrayToUse 将是一个字符串(不管sender.value 的值如何——它将被转换为一个字符串),i 将从0 迭代到字符串的长度。

一个小提示:它应该是for (**var** i = 0; …),否则i 将被视为一个全局变量,如果同时运行多个循环,它几乎肯定会以糟糕的方式结束。

编辑:要根据名称获取数组吗?在这种情况下,您必须在定义数组的任何上下文中查找它。

如果是全局数组,使用window

例如:

var arrayName = "arr" + sender.value;
var array = window[arrayName];
…

【讨论】:

  • 谢谢大卫,但我想做的是遍历一个具有字符串名称的实际数组..有意义吗?
  • 虽然有效(它做了一些事情,并且没有语法错误),但我认为它实际上并没有达到作者的意图。
【解决方案2】:

要获取一个变量定义的变量名,需要使用eval,像这样:

var arrayToUse = eval("arr" + sender.value);

但是,您必须非常小心,因为控制sender.value 将允许某人以这种方式劫持您的整个应用程序。您通常应该尝试寻找其他解决方案。

如果变量是在全局定义的,您可以将其查找为window["arr" + sender.value]。这仍然不理想,但安全风险较小。

【讨论】:

  • 我会不惜一切代价避免使用eval
【解决方案3】:

您需要做的是使用 name "arr" + sender.value 访问变量。访问 contents 为“arr + sender.value”的变量并不能满足您的要求——这只是一个字符串。

要访问具有该名称的变量,您可以将其作为全局变量进行查找(全局变量是浏览器中窗口对象的成员):

window["arr" + sender.value]

这比使用 eval() 更安全、更快速,因为它不会在 JavaScript 执行上下文中运行代码来评估字符串——它只是在窗口对象中查找具有该名称的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2017-04-26
    • 2014-02-10
    相关资源
    最近更新 更多