web-dev-qa-db-ja.com

グローバル変数が存在するかどうかを確認する正しい方法は何ですか?

JSLintはこれを有効なコードとして渡していません。

/* global someVar: false */
if (typeof someVar === "undefined") {
    var someVar = "hi!";
}

正しい方法は何ですか?

56
Ebrahim Byagowi
/*global window */

if (window.someVar === undefined) {
    window.someVar = 123456;
}

if (!window.hasOwnProperty('someVar')) {
    window.someVar = 123456;
}
77
bigoldbrute
/**
 * @param {string} nameOfVariable
 */
function globalExists(nameOfVariable) {
    return nameOfVariable in window
}

Var fooでグローバル変数を作成したかwindow.fooで作成したかは関係ありません。グローバルコンテキストでvarを使用して作成された変数はwindowに書き込まれます。

13
gvlasov

グローバル変数がまだ存在しない場合にのみグローバル変数を割り当てたい場合は、次を試してください:

window.someVar = window.someVar || 'hi';

または

window['someVar'] = window['someVar'] || 'hi';
11
mrak

試してみる

variableName in window

または

typeof window[variableName] != 'undefined'

または

window[variableName] !== undefined

または

window.hasOwnProperty(variableName)
8
gion_13

これは実際にはJSLintの問題だと思います。次のエラーが発行されます。

予期しない「typeof」。 「未定義」と直接比較してください。

これは悪いアドバイスだと思います。 JavaScriptでは、undefinedはグローバル変数であり、通常は未定義です。ただし、一部のブラウザでは、次のようにスクリプトによる変更が許可されています:window.undefined = 'defined'。この場合、undefinedと直接比較すると、予期しない結果が生じる可能性があります。幸いなことに、現在のECMA 5準拠のブラウザーは、undefinedへの割り当てを許可していません(そして、厳格モードで例外をスローします)。

typeof someVar === "undefined"、投稿したとおり、またはsomeVar in windowスーセイが示唆したように。

8
bfavaretto
if (typeof someVar === "undefined") {
    var someVar = "hi!";
}

someVar(ローカルまたはグローバル)が未定義かどうかを確認します。

グローバル変数を確認したい場合は、使用できます

if(window['someVar'] === undefined) {
    ...
}

これがブラウザにあると仮定します:)

5
Vatev

bfavarettoは正しくありません。

グローバル未定義を値に設定しても、未定義に対するオブジェクトのテストは変更されません。お気に入りのブラウザのJavaScriptコンソールでこれを試してください。

var udef; var idef = 42;
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
window.undefined = 'defined';
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".

これは、JavaScriptがすべてを無視し、未定義の変数に設定しようとした値があるためです。

window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".
2
Michael

これはチェックを実行する簡単な方法です。

ただし、variableNameが宣言され、boolean value: falseが割り当てられている場合、このチェックは失敗します。

if(window.variableName){

}
1
Prem Anand