このコードは、Ruan Yifeng 先生が書いた es6 の本に掲載されています。最終出力は 3 です。テキストの説明には、y の x と var x = 3 の x は同じ x ではないと書かれています。私は同じではありません。ここでそれを理解してください。 次に、var x= 3 の var を削除すると、2 が出力されますが、これはさらにわかりにくいものです。 。 。答えがあることを願っています
y() は、グローバル x ではなく、foo 関数のパラメーター x を変更します。 (ここでは、 y() を呼び出した後に console.log(x) を実行すると、グローバル x がまだ 1 であることがわかります。) 問題は単純です: 1) var x = 3 を使用すると、 console.log(x in foo ) が出力されます。 foo のローカル変数 x であり、y() はパラメーター x のみを変更するため、最終出力はローカル変数 x = 3 になります 2) var が使用されていない場合、foo のすべての x はパラメーター x を指し、y はused() パラメータ x を 2 に変更し、最終的に 2 を出力します
これはローカル変数とグローバル変数の違いです。メソッドでは var x = 3 はローカル変数ですが、メソッド本体ではローカル変数が使用されます。は使用されないため、var x = 3; の var を削除すると、出力は var x = 3; になります。これは、メソッド内に他のローカル変数が定義されていないことを意味します。出力は 2;
これには実際には、ES6 のデフォルト パラメーターによって導入された中間スコープが含まれます。 Ruan Yifeng も最初はこの問題を見逃していましたが、もちろんここでは正しいです。
中間スコープの目的は、デフォルトのパラメーターが関数内の変数によって汚染されるのを防ぐことです。デフォルト パラメーターの本来の目的は、パラメーターにデフォルト値を設定できるようにすることです。関数内の変数を増やすことができる場合、デフォルト パラメーターは意味がありません。具体的な説明と例については、記事を参照してください。
質問を振り返ってみると、
リーリーここには外側から内側に向かって 3 つのスコープがあります:
リーリーパラメータ x がない場合、マークは次のようになります:
リーリーy() は、グローバル x ではなく、foo 関数のパラメーター x を変更します。 (ここでは、 y() を呼び出した後に console.log(x) を実行すると、グローバル x がまだ 1 であることがわかります。)
問題は単純です: 1) var x = 3 を使用すると、 console.log(x in foo ) が出力されます。 foo のローカル変数 x であり、y() はパラメーター x のみを変更するため、最終出力はローカル変数 x = 3 になります
2) var が使用されていない場合、foo のすべての x はパラメーター x を指し、y はused() パラメータ x を 2 に変更し、最終的に 2 を出力します
y のデフォルト値は、グローバル変数の x を変更します。
var の var を削除します。この時点では、値 2 が割り当てられています
これはローカル変数とグローバル変数の違いです。メソッドでは var x = 3 はローカル変数ですが、メソッド本体ではローカル変数が使用されます。は使用されないため、var x = 3; の var を削除すると、出力は var x = 3; になります。これは、メソッド内に他のローカル変数が定義されていないことを意味します。出力は 2;
まず、var 演算子の定義を理解する必要があります。var 演算子で定義された変数は、変数が定義されているスコープ内でローカル変数になります。つまり、var を使用して変数を定義すると、関数の場合、この変数は関数に属します。ローカル変数は関数の終了時に破棄され、var を使用せずに直接定義された変数はグローバル変数になります。理解する必要があるもう 1 つの概念は、プログラムが変数を検索するとき、まず現在のスコープ内で検索し、見つからない場合はスコープ チェーンに沿って上方向に検索します。トラバース後に見つかった場合は、未定義と報告されます。
上記のコードに戻り、まず var を使用してグローバル スコープで x=1 を定義し、x はグローバル変数に属し、次に関数 foo 内でローカル変数 var x=3 を定義し、y 関数を実行して代入します。このとき、x は 2 になります。このとき変更されるのはローカル変数ではなく、グローバル変数 x であることに注意してください。x の値は内部で検索され、x=3 が見つかった後に値が出力されます。 var x=3 の var が削除されると、x はグローバル変数になります。このとき、グローバル変数 x は 1 つだけです。コードの実行順序に従い、グローバル変数をグローバルスコープで検索します。このとき、Xは2なので、結果は2
となります。
リーリー