Sobes.tech
Middle

Papaskink apie funkcijų kontekstą JavaScript.

sobes.tech AI

Atsakymas iš AI

this“ vykdymo kontekstas JavaScript nustato, kaip kviečiama funkcija ir kokios reikšmės yra prieinamos jos viduje. Kontekstas dinamiškai keičiasi priklausomai nuo kvietimo būdo:

  • Pasaulinis kontekstas: Už funkcijų ribų, this nurodo į globalų objektą (window naršyklėje, global Node.js).
    // Naršyklėje
    console.log(this === window); // true
    
    // Node.js
    console.log(this === global); // true
    
  • Funkcijos kontekstas:
    • Standartinis kvietimas: Ne-strict režimu this nurodo į globalų objektą (jei funkcija nėra objekto metodas). Strict režimu ("use strict";) this bus undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Ne-strict režimu: Globalus objektas; Strict režimu: `undefined`
      
    • Kvietimas kaip objekto metodas:
      • this nurodo į objektą, kuriam priklauso metodas:
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • Kvietimas su new (konstruktorius):
      • Sukuria naują objektą, kuris tampa this reikšme konstruktoriaus funkcijoje, ir grąžina tą objektą:
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Aiškus konteksto nurodymas (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Kviečia funkciją su nurodytu this ir atskirai išvardytais argumentais.
      • apply(thisArg, [argsArray]): Kviečia funkciją su nurodytu this ir argumentais masyve.
      • bind(thisArg, arg1, arg2, ...): Grąžina naują funkciją, kurios this yra amžinai susietas su thisArg ir argumentais.
      function introduce(greeting, punctuation) {
        console.log(greeting + ", I am " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Hi", "!");  // Hi, I am Charlie!
      introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie.
      
      const boundIntroduce = introduce.bind(person, "Hey");
      boundIntroduce("?"); // Hey, I am Charlie?
      
  • Arrow funkcijos: Neturi savo this. Jos paima this iš aplinkos, kurioje buvo apibrėžtos:
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` čia nurodo į `obj`
        setTimeout(() => {
          // `this` čia taip pat nurodo į `obj` (paveldėta iš `sayLater`)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David