必要なものを達成する唯一の可能な方法はeval()
、名前を文字列としてローカル変数にアクセスすることはできないため、悪を使用することです。(グローバルは を使用して可能window["variableNameAsString"]
です。)
以下に示すソリューション スニペットには、次の効果があります。
が宣言および初期化されていて ( を使用している場合でも)、現在のスコープから読み取り可能であるかどうtrue
かを返します。それ以外の場合は を返します。varName
null
false
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 属性を削除しますvarName
。undefined
- 変数が;かどうかをチェックします。- 属性を削除した要素の ID を再割り当てします。
注:この回答は大幅に編集されたため、一部のコメントはまだ適用できない場合があります。