Sobes.tech
Middle

Pověz o kontextu funkcí v JavaScriptu.

sobes.tech AI

Odpověď od AI

Kontext vykonání funkce (this) v JavaScriptu určuje, jak je funkce volána a jaké hodnoty jsou uvnitř ní dostupné. Kontext se dynamicky mění v závislosti na způsobu volání:

  • Globální kontext: Mimo funkce, this odkazuje na globální objekt (window v prohlížeči, global v Node.js).
    // V prohlížeči
    console.log(this === window); // true
    
    // V Node.js
    console.log(this === global); // true
    
  • Kontext funkce:
    • Standardní volání: V ne-strict módu this odkazuje na globální objekt (pokud funkce není metodou objektu). V strict módu ("use strict";) bude this undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // V ne-strict módu: Globální objekt; V strict: undefined
      
    • Volání jako metoda objektu:
      • this odkazuje na objekt, jehož je metoda součástí.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • Volání s new (konstruktor):
      • Vytvoří nový objekt, který se stává hodnotou this uvnitř konstruktorové funkce, a tento objekt vrací.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Explicitní určení kontextu (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Volá funkci s daným this a argumenty uvedenými zvlášť.
      • apply(thisArg, [argsArray]): Volá funkci s daným this a argumenty v poli.
      • bind(thisArg, arg1, arg2, ...): Vrací novou funkci, jejíž this je navždy přiřazen k thisArg a argumentům.
      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?
      
  • Šipkové funkce: Nemají vlastní this. Zachytávají this z okolního lexikálního prostředí, ve kterém byly definovány.
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` zde odkazuje na `obj`
        setTimeout(() => {
          // `this` zde také odkazuje na `obj` (zděděno z `sayLater`)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David