Javascript|this|矢印


var obj = {
    name: "B",
    print: function () {
      var inner1 = function () {
        console.log(this.name, name);
      };
      inner1();

      var inner2 = () => {
        console.log(this.name, name);
      };
      inner2();

      var name = "C";
      console.log(window.name, this.name, name);
    },
  };

  name = "A";
  obj.print();
私の新製品

  • print()のnameの値はよくわかりません.間違いそうですね?
    =>前回ハウスティンに関する文章。.

  • これは何を意味しますか?名前が変わるかどうかわからない
    =>今回のリリースに整理します.
  • this


    これは、関数呼び出しによって変化する自己参照オブジェクトです.
    通常はグローバルオブジェクト(ブラウザではwindow、ノード環境ではglobal)です.
    メソッドまたはコンストラクション関数では、thisは自分を表します.
    ちょっと難しいですが、コードで調べてみましょう.
      var obj = {
        name: "B",
        print: function () {
          console.log("obj.print 안의 this");
          console.log(this);
          var inner1 = function () {
            console.log("obj.print 안의 inner1 안의 this");
            console.log(this);
            console.log(this.name, name);
          };
          inner1();
    
          var inner2 = () => {
            console.log("obj.print 안의 inner2 안의 this");
            console.log(this);
            console.log(this.name, name);
          };
          inner2();
    
          var name = "C";
          console.log(window.name, this.name, name);
        },
      };
    
      name = "A";
      console.log("기본 this");
      console.log(this);
      obj.print();
    上のコードは各セクションにログを残して、thisの変化を理解します.

    デフォルトでは、Windowsはグローバルオブジェクトであるため、Windowsを表します.
    obj.print()が宣言されると、print()ではobjのメソッド呼び出しの結果となるため、自分のobjがそれになります.
    print()のinner 1では、グローバルオブジェクトウィンドウを再度表します.
    print()では、このメソッドのみが影響を受けます.Inner 1に影響しません.
    print()のinner 2では、なぜグローバルオブジェクトではないのでしょうか.
    inner 2は矢印関数なので.

    矢印関数


    矢印関数の背景

    [10, 20, 30].map(function (element) {
      return element * 2;
    })
    // [20, 40, 60]
    矢印関数の前に、関数キーとして関数を使用します.
    function() {
      // logic
    }
    しかし、functionキーワードは簡単に関数をマークすることができず、矢印関数が現れ、より簡単に使用することができます.

    矢印関数の特徴

  • 矢印関数は匿名関数としてのみ使用できます.
  • function () {
      // logic
    }
    
    () => {
      // logic
    }
    以上の2つのコードは同じコードです.矢印を使用すると、関数キーを必要とせずに操作を簡略化できます.
    匿名関数としてのみ使用できるため、関数宣言式ではなく関数式を使用します.
    特にコールバック関数を使用する場合、より簡潔です.
    [10, 20, 30].map((element) => { return element * 2 })
    // [20, 40, 60]
    
    // parameter 괄호 생략, return 생략
    [10, 20, 30].map(element => element * 2)
    // [20, 40, 60]
    
    ['1', '2', '3'].map(Number)
    // [1, 2, 3] 모두 string이 아닌 number
    パラメータが1の場合、カッコは省略できます.
    戻りのみで、特定の論理がない場合は、戻りを省略できます.
    2.これは違います.
    矢印関数のthisは、常に静的宣言矢印関数のthisと同じです.
    print()のinner 2は矢印関数であるため、inner 2のthisはprint()のthisと同じである.

    n/a.結論


    これが何を意味するか分かります.
    this.nameが何を意味するか分かりました.
    print()はobjオブジェクトのメソッドであるためobjを表す.
    print()のinner 1は、グローバルオブジェクトを表す関数です.
    だから心の中のこれは名前はwindownameは「A」を表し、nameはprint()にプラス記号で宣言され、初期化されず、定義されていない.
    print()のinner 2は矢印関数であるため、print()のthis objと同じです.
    だから中のこれは名前はobjです.nameは「B」を表し、nameもundefinedである.
    print()の中のこれ.名前はobjです.nameは「B」、nameは「C」を表す.
    整理する
    これは通常、グローバルオブジェクトを表しますが、呼び出し方法によって異なります.
    矢印関数thisは、静的に宣言されたthisと同じです.
    リファレンス
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
    https://poiemaweb.com/js-this
    https://poiemaweb.com/es6-arrow-function