'with' キーワードを使用すると、Javascript with hoisting と scoping で奇妙な動作が発生するようです。
「with」の使用がタブーと見なされていることは理解していますが、フレームワークの 1 つでこれに遭遇し、対処する必要がありました。しかし、それにもかかわらず、
「with」ブロックがある場合、宣言されているが未定義の変数がwithオブジェクトを使用して解決される理由を誰でも説明できますが、クロージャー変数の場合はそうではありません。
デモを行うには、次のコードの出力を参照してください: http://jsfiddle.net/ftK2Z/1/
var x = 90;
function test1(){
var address = {
street: 'Haight',
aptNum: 2
};
with (address){
alert(aptNum + ":" + x); // this outputs 2 : undefined.
var aptNum = 100,
x = 10 ;
}
}
グーグルクロームで確認しました。
注: 私は JS 巻き上げを理解し、アラートの後に var ステートメントを使用することが問題である理由を理解していますが、私が理解しようとしている主なことは、アラート ステートメントでのスコープ解決中に、「aptNum」と「x」の両方が必要であることです。巻き上げのためにローカルスコープで未定義であるため、「宣言されているが定義されていない」と見なす必要があります。
それでも、aptNum は「2」として出力されます。