From f98ccfecc4ac25c031cde8bf056071942f1b8c73 Mon Sep 17 00:00:00 2001 From: mdn-bot <108879845+mdn-bot@users.noreply.github.com> Date: Fri, 27 Sep 2024 01:30:17 +0000 Subject: [PATCH 01/11] ja: sync translated content --- files/ja/_redirects.txt | 3 +++ files/ja/web/api/{ => window}/queuemicrotask/index.md | 3 ++- files/ja/web/api/{ => window}/reporterror/index.md | 4 ++-- files/ja/web/api/{ => window}/structuredclone/index.md | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) rename files/ja/web/api/{ => window}/queuemicrotask/index.md (97%) rename files/ja/web/api/{ => window}/reporterror/index.md (97%) rename files/ja/web/api/{ => window}/structuredclone/index.md (98%) diff --git a/files/ja/_redirects.txt b/files/ja/_redirects.txt index e0e316c754739d..3179efb3068144 100644 --- a/files/ja/_redirects.txt +++ b/files/ja/_redirects.txt @@ -3374,8 +3374,11 @@ /ja/docs/Web/API/isSecureContext /ja/docs/Web/API/Window/isSecureContext /ja/docs/Web/API/origin /ja/docs/Web/API/Window/origin /ja/docs/Web/API/performance_property /ja/docs/Web/API/Window/performance +/ja/docs/Web/API/queueMicrotask /ja/docs/Web/API/Window/queueMicrotask /ja/docs/Web/API/range.intersectsNode /ja/docs/Web/API/Range/intersectsNode /ja/docs/Web/API/range.setStart /ja/docs/Web/API/Range/setStart +/ja/docs/Web/API/reportError /ja/docs/Web/API/Window/reportError +/ja/docs/Web/API/structuredClone /ja/docs/Web/API/Window/structuredClone /ja/docs/Web/API/tableRow.insertCell /ja/docs/Web/API/HTMLTableRowElement/insertCell /ja/docs/Web/API/tableRow.rowIndex /ja/docs/Web/API/HTMLTableRowElement/rowIndex /ja/docs/Web/API/window.URL /ja/docs/Web/API/URL diff --git a/files/ja/web/api/queuemicrotask/index.md b/files/ja/web/api/window/queuemicrotask/index.md similarity index 97% rename from files/ja/web/api/queuemicrotask/index.md rename to files/ja/web/api/window/queuemicrotask/index.md index 690663f6410af1..8d46d166db506f 100644 --- a/files/ja/web/api/queuemicrotask/index.md +++ b/files/ja/web/api/window/queuemicrotask/index.md @@ -1,6 +1,7 @@ --- title: queueMicrotask() -slug: Web/API/queueMicrotask +slug: Web/API/Window/queueMicrotask +original_slug: Web/API/queueMicrotask --- {{APIRef("HTML DOM")}} diff --git a/files/ja/web/api/reporterror/index.md b/files/ja/web/api/window/reporterror/index.md similarity index 97% rename from files/ja/web/api/reporterror/index.md rename to files/ja/web/api/window/reporterror/index.md index aa212c6fa89854..102bb4b397f2bd 100644 --- a/files/ja/web/api/reporterror/index.md +++ b/files/ja/web/api/window/reporterror/index.md @@ -1,7 +1,7 @@ --- title: reportError() グローバル関数 -short-title: reportError() -slug: Web/API/reportError +slug: Web/API/Window/reportError +original_slug: Web/API/reportError l10n: sourceCommit: 76717f752447b6eef25bf29c12272e407ee5cb6b --- diff --git a/files/ja/web/api/structuredclone/index.md b/files/ja/web/api/window/structuredclone/index.md similarity index 98% rename from files/ja/web/api/structuredclone/index.md rename to files/ja/web/api/window/structuredclone/index.md index 3f6911cf23eff7..f2dcc6cf0c76c4 100644 --- a/files/ja/web/api/structuredclone/index.md +++ b/files/ja/web/api/window/structuredclone/index.md @@ -1,7 +1,7 @@ --- title: structuredClone() グローバル関数 -short-title: structuredClone() -slug: Web/API/structuredClone +slug: Web/API/Window/structuredClone +original_slug: Web/API/structuredClone l10n: sourceCommit: cb279e20569055b200f93802d1704846c28aa04f --- From 26b6c9af229349987814b2bfbc2c0189903ec325 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Fri, 27 Sep 2024 11:55:32 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20(#23743)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/svg/element/desc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/ja/web/svg/element/desc/index.md b/files/ja/web/svg/element/desc/index.md index 8874ff143edc86..1a73a095b1086e 100644 --- a/files/ja/web/svg/element/desc/index.md +++ b/files/ja/web/svg/element/desc/index.md @@ -7,7 +7,7 @@ l10n: {{SVGRef}} -**``** 要素は SVG の[コンテナー要素](/ja/docs/Web/SVG/Element#container_elements)または[グラフィック要素](/ja/docs/Web/SVG/Element#graphics_elements)のアクセシブルな長文の説明を提供します。 +**``** 要素は SVG の[コンテナー要素](/ja/docs/Web/SVG/Element#コンテナー要素)または[グラフィック要素](/ja/docs/Web/SVG/Element#グラフィック要素)のアクセシブルな長文の説明を提供します。 `` 要素内のテキストはグラフィックの一部としてレンダリングされません。要素が可視テキストで記述できる場合、 [`aria-describedby`](/ja/docs/Web/Accessibility/ARIA/Attributes/aria-describedby) 属性でそのテキストを参照することが可能です。 `aria-describedby` を使用する場合、 `` よりも優先されます。 From 0cf9b509d7032a261c76be1eaf17a37d0ae3380f Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Mon, 23 Sep 2024 16:34:05 +0900 Subject: [PATCH 03/11] =?UTF-8?q?2024/07/26=20=E6=99=82=E7=82=B9=E3=81=AE?= =?UTF-8?q?=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5=E3=81=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/operators/this/index.md | 524 ++++++++++-------- 1 file changed, 289 insertions(+), 235 deletions(-) diff --git a/files/ja/web/javascript/reference/operators/this/index.md b/files/ja/web/javascript/reference/operators/this/index.md index e89018284b183a..f139f2cd7b23e4 100644 --- a/files/ja/web/javascript/reference/operators/this/index.md +++ b/files/ja/web/javascript/reference/operators/this/index.md @@ -1,115 +1,230 @@ --- title: this slug: Web/JavaScript/Reference/Operators/this +l10n: + sourceCommit: 8cb0caef8175e1772f13ef7bc761f9616e2c5a4b --- {{jsSidebar("Operators")}} -**関数の `this` キーワード** は、JavaScript ではほかの言語と少々異なる動作をします。また、[strict モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)であるかどうかでも違いがあります。 +**`this`** キーワードは、関数本体などのコードを実行するコンテキストを指します。最も一般的な用途はオブジェクトメソッドで、この場合、`this` はメソッドが関連付けられているオブジェクトを指し、これにより、同じメソッドをさまざまなオブジェクトで再利用することができます。 -ほとんどの場合、`this` の値はどのように関数が呼ばれたかによって決定されます (実行時結合)。これは実行時に代入によって設定することはできず、関数が呼び出されるたびに異なる可能性があります。ES5 では {{jsxref("Function.prototype.bind()", "bind()")}} メソッドが導入され、関数が{{jsxref('Operators/this', "どのように呼ばれたかに関係なく `this` の値を設定する", 'The_bind_method', 1)}}することができるようになり、ES2015 では、自身では `this` の結び付けを行わない[アロー関数](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)が導入されました (これは包含する構文上のコンテキストの `this` の値を保持します)。 +JavaScript で `this` の値は、関数がどのように定義されているかではなく、どのように呼び出されるか(実行時の{{glossary("binding", "バインド方法")}})によって決まります。通常の関数がオブジェクトのメソッドとして呼び出された場合 (`obj.method()`)、`this` はそのオブジェクトを指します。単独の関数として呼び出された場合(オブジェクトに関連付けられていない func())、this は通常、[グローバルオブジェクト](/ja/docs/Glossary/Global_object)(厳格モードでない場合)、グローバルオブジェクトまたは `undefined` ([厳格モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)の場合)を指します。 +{{jsxref("Function.prototype.bind()")}} メソッドは、`this` のバインドが変更されない関数を作成できます。また、{{jsxref("Function.prototype.apply()")}} および {{jsxref("Function.prototype.call()")}} メソッドは、特定の呼び出しに対して `this` の値を設定することもできます。 + +[アロー関数](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)では、`this` の扱いが異なります。定義された時点で親スコープから継承します。この動作により、アロー関数はコールバックやコンテキストの保持を行う上で特に便利です。ただし、アロー関数には独自の `this` バインディングがありません。そのため、`bind()`、`apply()`、`call()` メソッドで `this` の値を設定することはできません。また、オブジェクトメソッドで現在のオブジェクトを指すこともできません。 {{EmbedInteractiveExample("pages/js/expressions-this.html")}} ## 構文 -``` +```js-nolint this ``` ### 値 -strict モードでない場合は、実行コンテキスト (グローバル、関数、eval) のプロパティで、常にオブジェクトへの参照です。 strict モードではどのような値でも取り得ます。 +厳格モードでない場合は、`this` は常にオブジェクトを参照します。厳格モードでは、どのような値もどのような値でも取り得ます。値の決定方法に関する詳細情報は、下記を参照してください。 ## 解説 -### グローバルコンテキスト +この値は、それが現れるコンテキスト(関数、クラス、グローバル)によって異なります。 -グローバル実行コンテキスト (すべての関数の外側) では、strict モードであるかどうかにかかわらず、`this` はグローバルオブジェクトを参照します。 +### 関数コンテキスト + +関数内での `this` の値は、関数の呼び出し方によって異なります。 + +下記のコードは [strict モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)ではないため、また呼び出し時に `this` の値が設定されないため、`this` は既定でグローバルオブジェクトとなり、これはブラウザーでは {{domxref("Window", "window")}} です。 ```js -// ウェブブラウザーでは window オブジェクトもグローバルオブジェクトです。 -console.log(this === window); // true +function getThis() { + return this; +} -a = 37; -console.log(window.a); // 37 +const obj1 = { name: "obj1" }; +const obj2 = { name: "obj2" }; -this.b = "MDN"; -console.log(window.b); // "MDN" -console.log(b); // "MDN" +obj1.getThis = getThis; +obj2.getThis = getThis; + +console.log(obj1.getThis()); // { name: 'obj1', getThis: [Function: getThis] } +console.log(obj2.getThis()); // { name: 'obj2', getThis: [Function: getThis] } ``` -> [!NOTE] -> コードが実行されている現在のコンテキストに関係なく、グローバルの {{jsxref("globalThis")}} プロパティを使用していつでも簡単にグローバルオブジェクトを取得できます。 +関数は同じですが、呼び出し方法によって `this` の値が異なることに注目してください。これは、関数への引数がどのように動作するのかと似ています。 -### 関数コンテキスト +`this` の値は、自分自身のプロパティとして機能を持つオブジェクトではなく、その機能を呼び出すために使用されるオブジェクトです。これを証明するために、[プロトタイプチェーン](/ja/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)の上位にあるオブジェクトのメソッドを呼び出してみましょう。 -関数内での `this` の値は、関数の呼び出し方によって異なります。 +```js +const obj3 = { + __proto__: obj1, + name: "obj3", +}; -下記のコードは [strict モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)ではないため、また呼び出し時に `this` の値が設定されないため、`this` は既定でグローバルオブジェクトとなり、これはブラウザーでは {{domxref("Window", "window")}} です。 +console.log(obj3.getThis()); // { name: 'obj3' } +``` + +`this` の値は、関数がオブジェクトに作成時に定義された場合でも、常にその関数がどのように呼び出されたかによって変化します。 + +```js +const obj4 = { + name: "obj4", + getThis() { + return this; + }, +}; + +const obj5 = { name: "obj5" }; + +obj5.getThis = obj4.getThis; +console.log(obj5.getThis()); // { name: 'obj5', getThis: [Function: getThis] } +``` + +メソッドにアクセスする値がプリミティブの場合、`this` はプリミティブ値となります。ただし、関数が厳格モードの場合のみです。 ```js -function f1() { +function getThisStrict() { + "use strict"; // 厳格モードに入る return this; } -// ブラウザー上で -f1() === window; // true +// デモ専用のものです。組み込みのプロトタイプを変更しないでください。 +Number.prototype.getThisStrict = getThisStrict; +console.log(typeof (1).getThisStrict()); // "number" +``` + +何らかの形でアクセスされることなく関数が呼び出された場合、`this` は `undefined` となります。ただし、関数が厳格モードの場合のみです。 -// Node 上で -f1() === global; // true +```js +console.log(typeof getThisStrict()); // "undefined" ``` -ただし strict モードでは、実行コンテキストに入るときに `this` 値が設定されていないと、以下の例のように `undefined` のままになります。 +厳格モードではない場合、[`this` 置換](/ja/docs/Web/JavaScript/Reference/Strict_mode#no_this_substitution)と呼ばれる特別な処理により、この値が常にオブジェクトであることが確実に保持されます。これはつまり、 + +- 関数が `this` を `undefined` または `null` に設定されて呼び出された場合、`this` は {{jsxref("globalThis")}} に置き換えられます。 +- 関数が `this` をプリミティブ値に設定されて呼び出された場合、`this` はそのプリミティブ地のラッパーオブジェクトに置き換えられます。 ```js -function f2() { - "use strict"; // strict モードにする +function getThis() { return this; } -f2() === undefined; // true +// デモ専用のものです。組み込みのプロトタイプを変更しないでください。 +Number.prototype.getThis = getThis; +console.log(typeof (1).getThis()); // "object" +console.log(getThis() === globalThis); // true ``` -> [!NOTE] -> 二番目の例において、`this` が {{jsxref("undefined")}} となるのは `f2` が直接呼び出されており、オブジェクトのメソッドやプロパティ (例えば `window.f2()`) ではないためです。この機能は初めて [strict モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)への対応が始まったとき、一部のブラウザーが実装していませんでした。結果的に、これらのブラウザーは不正確に `window` オブジェクトを返していました。 +一般的な関数呼び出しでは、この値は関数の接頭辞(ドットの前の部分)を通して暗黙的に引数として渡されます。また、`this` の値は {{jsxref("Function.prototype.call()")}}、{{jsxref("Function.prototype.apply()")}}、{{jsxref("Reflect.apply()")}} のメソッドを使用して、明示的に設定することもできます。{{jsxref("Function.prototype.bind()")}} を使用すると、関数の呼び出し方法に関わらず変更されない特定の `this` 値を持つ新しい関数を作成することができます。これらのメソッドを使用する場合、関数が厳格モードでない場合でも、上記の `this` の置換ルールが適用されます。 -関数の呼び出し時に `this` の値を特定の値に設定するには、以下の例のように {{jsxref("Function.prototype.call()", "call()")}} または {{jsxref("Function.prototype.apply()", "apply()")}} を使用します。 +#### コールバック -### クラスコンテキスト +関数がコールバックとして渡される場合、`this` の値はコールバックがどのように呼び出されるかによって決まり、これはAPIの実装者によって決定されます。コールバックは通常、`this` の値が `undefined` で(オブジェクトに関連付けずに直接)呼び出されます。これは、関数が厳格モードでない場合、`this` の値はグローバルオブジェクト ({{jsxref("globalThis")}}) であることを意味します。これは、[反復処理可能な配列メソッド](/ja/docs/Web/JavaScript/Reference/Global_Objects/Array#反復処理メソッド)、[`Promise()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) コンストラクターなどにも当てはまります。 -[クラス](/ja/docs/Web/JavaScript/Reference/Classes)は関数の機能であるため、クラスと関数の `this` の動作は似ています。ただし、いくつかの違いと注意点があります。 +```js +function logThis() { + "use strict"; + console.log(this); +} + +[1, 2, 3].forEach(logThis); // undefined, undefined, undefined +``` -クラスのコンストラクター内では、`this` は通常のオブジェクトです。クラス内のすべて静的でないメソッドは `this` のプロトタイプに追加されます。 +API によっては、コールバックの呼び出し時に `this` の値を設定することができます。例えば、すべての反復処理配列メソッドと、{{jsxref("Set.prototype.forEach()")}} のような関連メソッドでは、オプションの `thisArg` 引数を受け入れます。/\ ```js -class Example { - constructor() { - const proto = Object.getPrototypeOf(this); - console.log(Object.getOwnPropertyNames(proto)); - } - first() {} - second() {} - static third() {} +[1, 2, 3].forEach(logThis, { name: "obj" }); +// { name: 'obj' }, { name: 'obj' }, { name: 'obj' } +``` + +時には、`this` 値が `undefined` 以外でコールバックが呼び出されることもあります。例えば、{{jsxref("JSON.parse()")}} の `reviver` 引数と {{jsxref("JSON.stringify()")}} の `replacer` 引数はどちらも、この値が解釈/シリアライズできるプロパティが属するオブジェクトに設定されて呼び出されます。 + +#### アロー関数 + +[アロー関数](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)では、`this` 値は周囲の字句コンテキストの `this` の値を保持します。言い換えれば、アロー関数の本体を評価する際、言語は新しい `this` のバインドを作成しません。 + +例えば、グローバルコードでは、`this` は厳格モードであるかどうかにかかわらず、常に `globalThis` となります。これは、[グローバルコンテキスト](#グローバルコンテキスト)のバインドによるものです。 + +```js +const globalObject = this; +const foo = () => this; +console.log(foo() === globalObject); // true +``` + +アロー関数は、その関数が存在するスコープの `this` 値を囲む[クロージャ](/ja/docs/Web/JavaScript/Closures)を作成します。つまり、アロー関数は「自動バインド」されているかのように動作します。つまり、どのように呼び出されたとしても、`this` は関数が作成された時点での値(例えば、グローバルオブジェクト)にバインドされます。他の関数内で作成されたアロー関数にも同じことが言えます。そのthisは、それを囲む字句コンテキストのままです。[下記の例を参照してください](#アロー関数内の_this)。 + +さらに、`call()`、`bind()`、`apply()` を使用してアロー関数を呼び出す場合、`thisArg` 引数は無視されます。ただし、これらのメソッドを使用しても、他にも引数を渡すことができます。 + +```js +const obj = { name: "obj" }; + +// call を使用して this を設定しようとする +console.log(foo.call(obj) === globalObject); // true + +// bind を使用して this を設定しようとする +const boundFoo = foo.bind(obj); +console.log(boundFoo() === globalObject); // true +``` + +#### コンストラクター + +関数がコンストラクター({{jsxref("Operators/new", "new")}} キーワード付き)として使用される場合、コンストラクター関数がどのオブジェクトにアクセスしているかに関わらず、その `this` は、構築中の新しいオブジェクトにバインドされます。コンストラクターが別のプリミティブ値以外の値を返さない限り、`this` の値は `new` 式の値となります。 + +```js +function C() { + this.a = 37; +} + +let o = new C(); +console.log(o.a); // 37 + +function C2() { + this.a = 37; + return { a: 38 }; } -new Example(); // ['constructor', 'first', 'second'] +o = new C2(); +console.log(o.a); // 38 ``` -> [!NOTE] -> 静的メソッドは `this` のプロパティではありません。クラス自身のプロパティです。 +2 つ目の例 (`C2`) では、構築中にオブジェクトが返されるため、`this` にバインドされていた新しいオブジェクトは破棄されます。(これは本質的に、`this.a = 37;` の文をデッドコードにします。このコードは実行されるため、厳密にはデッドコードではありませんが、外部に影響を与えることなく削除することができます。) + +#### super + +`super.method()` 形式で関数が最初に呼び出された場合、`method` 関数内の `this` は `super.method()` 呼び出しの周辺の `this` 値と同じ値であり、通常 `super` が参照するオブジェクトとは異なります。これは、`super.method` が上記のオブジェクトメンバーにアクセスするようなものではないためです。これは、異なるバインドルールを持つ特別な構文です。例えば、[`super` のリファレンス](/ja/docs/Web/JavaScript/Reference/Operators/super#calling_methods_from_super)を参照してください。 + +### クラスコンテキスト -### 派生クラス +[クラス](/ja/docs/Web/JavaScript/Reference/Classes)は、静的コンテキストとインスタンスコンテキストの 2 つに分けることができます。[コンストラクター](/ja/docs/Web/JavaScript/Reference/Classes/constructor)、メソッド、インスタンスフィールド初期化子([パブリック](/ja/docs/Web/JavaScript/Reference/Classes/Public_class_fields)または[プライベート](/ja/docs/Web/JavaScript/Reference/Classes/Private_properties))はインスタンスコンテキストに属します。[静的](/ja/docs/Web/JavaScript/Reference/Classes/static)メソッド、静的フィールド初期化子、静的初期化ブロックは静的コンテキストに属します。それぞれのコンテキストで、`this` の値が異なります。 -基本クラスのコンストラクターとは異なり、派生コンストラクターには初期の `this` の結び付けがありません。{{jsxref("Operators/super", "super()")}} を呼び出すとコンストラクター内に `this` の結び付けが作成され、基本的に以下のコードを評価する効果があります。ここで、Base は継承されたクラスです。 +クラスのコンストラクターは常に `new` で呼び出されるため、その動作は[関数コンストラクター](#コンストラクター)と同じです。`this` 値は、作成される新しいインスタンスです。 クラスメソッドは、オブジェクトリテラル内のメソッドと同じように動作します。`this` 値は、メソッドがアクセスされたオブジェクトです。 メソッドが他のオブジェクトに転送されない場合、`this` は通常、クラスのインスタンスです。 + +静的メソッドは `this` のプロパティではありません。クラス自体のプロパティです。つまり、それらは一般的にクラスにアクセスされるため、`this` はクラス(またはサブクラス)の値です。静的初期化ブロックも、`this` を現在のクラスに設定して評価します。 + +フィールド初期化子もクラスのコンテキストで評価されます。インスタンスフィールドは、`this` を構築中のインスタンスに設定して評価されます。静的フィールドは、`this` を現在のクラスに設定して評価されます。これが、フィールド初期化子でアロー関数が[インスタンスフィールドの場合はインスタンスに、静的フィールドの場合はクラスにバインドされる](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#メソッドとしては使用不可)理由です。 ```js +class C { + instanceField = this; + static staticField = this; +} + +const c = new C(); +console.log(c.instanceField === c); // true +console.log(C.staticField === C); // true +``` + +#### 派生クラスのコンストラクター + +基本クラスのコンストラクターとは異なり、派生コンストラクターには初期の `this` の結び付けがありません。{{jsxref("Operators/super", "super()")}} を呼び出すとコンストラクター内に `this` のバインドが作成され、基本的に以下のコードを評価する効果があります。ここで、`Base` は継承されたクラスです。 + +```js-nolint this = new Base(); ``` > **警告:** `this` を `super()` の呼び出しの前に参照すると、エラーが発生します。 -派生クラスはでは `super()` を呼び出す前に return をしてはいけません。ただし、 `Object` を返す場合やコンストラクターがない場合を除きます。 +派生クラスはでは `super()` を呼び出す前に return をしてはいけません。ただし、オブジェクトを返す場合やコンストラクターがない場合を除きます。 ```js class Base {} @@ -125,50 +240,98 @@ class Bad extends Base { new Good(); new AlsoGood(); -new Bad(); // 参照エラー +new Bad(); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor +``` + +### グローバルコンテキスト + +グローバル実行コンテキスト(関数やクラスの外部、グローバルスコープで定義された[ブロック](/ja/docs/Web/JavaScript/Reference/Statements/block)または[アロー関数](#アロー関数)の内部の場合もあり)では、スクリプトが動作する実行コンテキストによって `this` の値が決まります。 [コールバック](#コールバック)と同様に、`this` の値は実行環境(呼び出し側)によって決定されます。 + +スクリプトの最上位レベルでは、`this` 値は厳格モードであるかどうかに関わらず、`globalThis` を参照します。これは一般的にグローバルオブジェクトと同じです。例えば、ソースが HTML の [`