8

是否可以通过将两个字符串连接在一起形成名称来设置变量?

如果可能的话,我想根据用户单击的对象的类名来确定要设置的变量。我知道我可以硬编码一堆 if/else if 语句,但如果我可以间接引用这些变量,那就太酷了。我在想这样的事情:

var owner_read;
var group_read;

function setVariableIndirectly(object){
    var second = object.className; // returns "read"
    var first = object.parentElement.className; // returns "group"

    first + "_" + second = "set this as the new variable";
}

有没有办法做到这一点?

编辑:

这是数据来自的html。

<p class="owner">
    <span class="read" onclick="permissionClick(this)">r</span>
    <span class="write" onclick="permissionClick(this)">w</span>
    <span class="execute" onclick="permissionClick(this)">x</span>
</p>
4

3 回答 3

12

这是可能的,但您必须警惕上下文和范围。

1. 在浏览器环境中设置全局范围的变量:

window[str1 + str2] = value

2. 在节点环境中设置全局范围的变量:

global[str1 + str2] = value

3. 在一个闭包内并在该闭包内:

this[str1 + str2] = value

在闭包内,global 和 window 仍然会设置全局。请注意,如果您在一个被调用的函数中,“this”可能引用另一个对象。

于 2013-10-31T03:26:26.740 回答
7

目前尚不清楚您要完成什么,但您可以按名称访问变量作为对象的属性。

// this is the container to hold your named variables 
//    (which will be properties of this object)
var container = {};

function setVariableIndirectly(obj){
    var second = obj.className; // returns "read"
    var first = obj.parentNode.className; // returns "group"

    // this is how you access a property of an object 
    //    using a string as the property name    
    container[first + "_" + second] = "set this as the new variable";

   // in your example container["read_group"] would now be set
}

如上所示,将变量放在您自己的容器对象上可能会更好,但您也可以通过window对象上的属性访问全局变量。

于 2013-10-31T03:06:25.400 回答
1

您可以这样设置全局变量:

window[first + "_" + second] = "set this as the new variable";

并访问它:

console.log(group_read);
于 2013-10-31T03:07:25.817 回答