検索

ホームページ  >  に質問  >  本文

javascript - 関数によるパラメータのデフォルト値の設定の問題

リーリー

このコードは、Ruan Yifeng 先生が書いた es6 の本に掲載されています。最終出力は 3 です。テキストの説明には、y の x と var x = 3 の x は同じ x ではないと書かれています。私は同じではありません。ここでそれを理解してください。
次に、var x= 3 の var を削除すると、2 が出力されますが、これはさらにわかりにくいものです。 。 。答えがあることを願っています

巴扎黑巴扎黑2734日前840

全員に返信(7)返信します

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-05 10:39:59

    これには実際には、ES6 のデフォルト パラメーターによって導入された中間スコープが含まれます。 Ruan Yifeng も最初はこの問題を見逃していましたが、もちろんここでは正しいです。

    中間スコープの目的は、デフォルトのパラメーターが関数内の変数によって汚染されるのを防ぐことです。デフォルト パラメーターの本来の目的は、パラメーターにデフォルト値を設定できるようにすることです。関数内の変数を増やすことができる場合、デフォルト パラメーターは意味がありません。具体的な説明と例については、記事を参照してください。

    質問を振り返ってみると、

    リーリー

    ここには外側から内側に向​​かって 3 つのスコープがあります:

    リーリー

    パラメータ x がない場合、マークは次のようになります:

    リーリー

    返事
    0
  • 阿神

    阿神2017-07-05 10:39:59

    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 を出力します

    返事
    0
  • PHP中文网

    PHP中文网2017-07-05 10:39:59

    y のデフォルト値は、グローバル変数の x を変更します。
    var の var を削除します。この時点では、値 2 が割り当てられています

    返事
    0
  • 天蓬老师

    天蓬老师2017-07-05 10:39:59

    これはローカル変数とグローバル変数の違いです。メソッドでは var x = 3 はローカル変数ですが、メソッド本体ではローカル変数が使用されます。は使用されないため、var x = 3; の var を削除すると、出力は var x = 3; になります。これは、メソッド内に他のローカル変数が定義されていないことを意味します。出力は 2;

    返事
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-07-05 10:39:59

    まず、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
    となります。

    返事
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-07-05 10:39:59

    リーリー

    返事
    0
  • 为情所困

    为情所困2017-07-05 10:39:59

    返事
    0
  • キャンセル返事