8

2 つの文字列を連結して名前を形成することで、変数を設定することは可能ですか?

可能であれば、ユーザーがクリックしたオブジェクトのクラス名に基づいて、設定する変数を決定したいと思います。一連の 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 に答える