Sobes.tech
Middle

Pastāsti par funkciju kontekstu JavaScript.

sobes.tech AI

Atbilde no AI

JavaScript-ā funkcijas izpildes konteksts (this) nosaka, kā funkcija tiek izsaukta un kādas vērtības ir pieejamas tās iekšpusē. Konteksts dinamiski mainās atkarībā no izsaukšanas veida:

  • Globālais konteksts: ārpus funkcijām, this atsaucas uz globālo objektu (window pārlūkprogrammā, global Node.js).
    // Pārlūkprogrammā
    console.log(this === window); // true
    
    // Node.js
    console.log(this === global); // true
    
  • Funkcijas konteksts:
    • Standarta izsaukums: Ne-strict režīmā this atsaucas uz globālo objektu (ja funkcija nav objekta metode). Strict režīmā ("use strict";) this būs undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Ne-strict režīmā: Globālais objekts; Strict režīmā: `undefined`
      
    • Izsaukums kā objekta metode:
      • this atsaucas uz objektu, kam pieder metode:
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • Izsaukums ar new (konstruktors):
      • Izveido jaunu objektu, kas kļūst par this vērtību konstruktorā, un atgriež šo objektu:
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Īpašas konteksta norādīšana (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Izsauc funkciju ar norādīto this un argumentiem.
      • apply(thisArg, [argsArray]): Izsauc funkciju ar norādīto this un argumentiem masīvā.
      • bind(thisArg, arg1, arg2, ...): Atgriež jaunu funkciju, kuras this ir pastāvīgi saistīts ar thisArg un argumentiem.
      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 funkcijas: Tām nav savs this. Tās ņem this no apkārtējās leksiskās vides, kur tās tika definētas:
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` šeit atsaucas uz `obj`
        setTimeout(() => {
          // `this` šeit arī atsaucas uz `obj` (manto no `sayLater`)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David