これは静的スコープです。関数内のステートメントは、その関数内でスコープされます。
ただし、Javascript には風変わりな動作があります。つまり、varキーワードがないと、グローバル変数が暗示されます。それがあなたのテストで見ているものです。「d」変数は、関数の本体内に記述されているにもかかわらず、暗黙のグローバルであるため使用できます。
また、質問の 2 番目の部分に答えるには: 関数は、変数と同様に、宣言されているスコープに存在します。
補足:
グローバル変数、特に暗黙の変数は必要ないでしょう。混乱を防ぎ、すべてをクリーンに保つために、常に var キーワードを使用することをお勧めします。
補足:
ECMA 標準は、Javascript に関する回答を見つけるのにおそらく最も役立つ場所ではありませんが、確かに悪いリソースではありません。ブラウザの JavaScript はその標準の単なる実装であることを忘れないでください。そのため、標準ドキュメントは、JavaScript エンジンが構築されたときに実装者が (ほとんど) 従った規則を提供します。気になる実装、つまり主要なブラウザーに関する特定の情報を提供することはできません。特に、主要なブラウザーでの JavaScript の実装がどのように動作するかについて非常に直接的な情報を提供する書籍が 2 冊あります。違いを説明するために、ECMAScript 仕様と Javascript に関する本の両方からの抜粋を以下に示します。私はあなたを思う'
これはECMAScript言語仕様からのものです:
10.2実行コンテキストの入力
関数がそれ自体を再帰的に呼び出している場合でも、すべての関数とコンストラクターの呼び出しは新しい実行コンテキストに入ります。すべての return は実行コンテキストを終了します。スローされた例外は、キャッチされない場合、1 つ以上の実行コンテキストを終了することもあります。
制御が実行コンテキストに入ると、スコープ チェーンが作成および初期化され、変数のインスタンス化が実行され、この値が決定されます。
スコープ チェーンの初期化、変数のインスタンス化、および this 値の決定は、入力されるコードのタイプによって異なります。
以下は、O'Reilly のJavascript: The Definitive Guide (第 5 版)からのものです。
8.8.1 レキシカルスコープ
JavaScript の関数は、動的にスコープされるのではなく、レキシカルにスコープされます。これは、実行元のスコープではなく、定義されているスコープで実行されることを意味します。関数が定義されると、現在のスコープ チェーンが保存され、関数の内部状態の一部になります。...
これらの種類の質問をカバーするために強く推奨されるのは、Douglas Crockford の本です。
JavaScript、良い部分 http://oreilly.com/catalog/covers/9780596517748_cat.gif
Javascript、The Good Partsも O'Reilly から。