javascriptの未定義/未宣言の変数のさまざまな動作を調べました。例:
var obj = {};
console.log(x);//Error
console.debug(obj.x) ;//undefined
私の質問は、cとobj.xの両方が宣言または定義されていないのに、なぜdiff動作が発生するのですか?私は何かが足りないのですか?どの変数がすでに存在するかどうかをどのように追跡する必要がありますか?
javascriptの未定義/未宣言の変数のさまざまな動作を調べました。例:
var obj = {};
console.log(x);//Error
console.debug(obj.x) ;//undefined
私の質問は、cとobj.xの両方が宣言または定義されていないのに、なぜdiff動作が発生するのですか?私は何かが足りないのですか?どの変数がすでに存在するかどうかをどのように追跡する必要がありますか?
これは、javascriptで予想される動作です。宣言されていない変数(x)にアクセスしている場合、エンジンがアクセスしようとしているものを認識していないため、エラーが発生します。
一方、オブジェクトにはある種の二重の性質があります。これはオブジェクトと配列の両方として機能し、javascriptを使用すると、指定されたキーの下のメンバーが存在しない場合でも、配列のメンバーにアクセスを試みることができます。指定された値の下にキーがない場合は、に戻りundefined
ます。つまり、次の2行は同等です
console.log(obj.x);
と
console.log(obj["x"]);
存在しない変数のメンバーにアクセスしようとした場合にのみエラーが発生します。例えば
console.log(obj.x.x);
未定義の変数にアクセスしようとすると、エラーが発生します。これにより、バグをより簡単に見つけることができるため、一般的には良いことです。
変数が定義されているかどうかを知りたい場合は、次のようにそのタイプを確認できます。
console.info(typeof x === "undefined" ? "<undefined!>" : x);
の場合obj.x
、x
は変数ではなくプロパティであり、JavaScriptオブジェクトの動的な性質により、いつでもプロパティを検索できます。
非厳密モードで割り当てない限り、宣言されていない変数をエラーなしで参照することはできません。その場合、変数は暗黙のグローバルになります。ただし、厳密モードでもエラーが発生します。
オブジェクトのプロパティにアクセスしようとすることは、変数にアクセスしようとすることと同じではありませんが、次の場所からグローバル変数にアクセスできますwindow
。
x; //referenceerror
window.x; //undefined, no reference error
window.x
vs
を使用する必要があります。x
var x = 5;
(function(){
var x = 3;
x === 3; //We cannot access the 5
window.x === 5 //Only window.x will do it here
})()