7

変数名が「使用中」かどうかを確認するにはどうすればよいですか? var varname = 'something'意味: 変数名がステートメントで既に使用されているかどうかを確認するにはどうすればよいですか?

通常、正常にtypeof varname == 'undefined'動作しているように見えるかどうかを確認するだけです。問題は、ページに の要素がある場合ですid="varname"今、チェックするtypeof varname == 'undefined'と、HTML 要素があるfalseため、関係なく表示されます。varname

varname「使用中」ではありませんが、undefinedどちらでもありません。

<body id="test1"></body>
<script>
    //if <body> has an id of test1, how do i check if test1 is undeclared?
    console.log(typeof test1 == 'undefined'); // the <body> element causes this to be true
    console.log(typeof test2 == 'undefined'); // outputs true as expected
</script>

さらに、コーナー ケースを確認できますか:var test1 = document.getElementById('test1')実行されましたか?

4

3 に答える 3

6

必要なものを達成する唯一の可能な方法はeval()、名前を文字列としてローカル変数にアクセスすることはできないため、悪を使用することです。(グローバルは を使用して可能window["variableNameAsString"]です。)

以下に示すソリューション スニペットには、次の効果があります。

が宣言および初期化されていて ( を使用している場合でも)、現在のスコープから読み取り可能であるかどうtrueかを返します。それ以外の場合は を返します。varNamenullfalse

DEMO jsFiddle はこちら。

ソース:

function removeIdOfAllElementsWithId(id) {
    var element, elementsFound = [];
    while ((element = document.getElementById(id)) !== null) {
        element.removeAttribute('id')
        elementsFound.push(element);
    }
    return elementsFound;
}
function assignIdToElements(elements, id) {
    for (var i = 0, n = elements.length; i < n; i++) { elements[i].id = id; }
}
var isDefinedEval = '(' +
    function (isDefinedEvalVarname) {
        var isDefinedEvalResult;
        var isDefinedEvalElementsFound = removeIdOfAllElementsWithId(isDefinedEvalVarname);
        try {
            isDefinedEvalResult = eval('typeof '+isDefinedEvalVarname+' !== "undefined"');
        } catch (e) {
            isDefinedEvalResult = false;
        }
        assignIdToElements(isDefinedEvalElementsFound, isDefinedEvalVarname);
        return isDefinedEvalResult;
    }
+ ')';

使用法:

名前付きの変数variableNameが定義されているかどうかをテストするには:

eval(isDefinedEval + '("' + 'variableName' + '")') === true

定義されていないかどうかを確認するには:

eval(isDefinedEval + '("' + 'variableName' + '")') === false

フィドルでは、動作を実証および検証する多くの単体テストを見つけることができます。

テスト:

  • フィドルにはいくつかのテストが含まれています。
  • このスニペットは、IE7、IE8、IE9、および最新の Chrome と Firefox でテストされています。

説明:

この関数はeval()、ローカルで宣言された変数にアクセスする必要があるため、最後まで使用する必要があります。

このような変数にアクセスするには、関数を同じスコープで宣言する必要があります。それeval()がそこで行うことです。ローカルスコープで関数を宣言し、引数として呼び出しvarNameます。

それはさておき、関数は基本的に次のとおりです。 - ID === を持つすべての要素の ID 属性を削除しますvarNameundefined- 変数が;かどうかをチェックします。- 属性を削除した要素の ID を再割り当てします。

注:この回答は大幅に編集されたため、一部のコメントはまだ適用できない場合があります。

于 2013-05-09T05:06:17.567 に答える
1

一部のブラウザーのグローバル コンテキスト以外のコンテキストでは、変数が定義されているか (宣言されているか初期化されているかのいずれかによって)、または を使用する以外にないかどうかを確実に判断することは不可能try..catchです。

したがって、それを行う必要があるのは良い戦略ではありません。

グローバル コンテキストでは、IE 以外のブラウザでは、次のようなことができます。

var global = this;

if (!global.hasOwnProperty('foo')) {
  // there is no global foo
}

しかし、IE はグローバル オブジェクトにhasOwnPropertyを実装していません。DOM 要素の名前と ID は、宣言されたグローバル変数の値を上書きしないことに注意してください。

しかし、とにかく、あなたが持っている可能性があるので、これはすべて役に立たない:

var foo = document.getElementById('foo');

今何?

于 2013-05-09T05:08:51.077 に答える