Sobes.tech
Middle

Porozprávaj o kontexte funkcií v JavaScript.

sobes.tech AI

Odpoveď od AI

Контекст izvršavanja (this) u JavaScript-u одређује како се функција позива и које вредности су доступне унутар ње. Контекст се динамички мења у зависности од начина позива:

  • Глобални контекст: ван функција, this се односи на глобални објекат (window у прегледачу, global у Node.js-у).
    // У прегледачу
    console.log(this === window); // true
    
    // У Node.js-у
    console.log(this === global); // true
    
  • Контекст функције:
    • Стандардни позив: У не-строг режиму this се односи на глобални објекат (ако функција није метод објекта). У strict режиму ("use strict";) this ће бити undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // У не-строг режиму: Глобални објекат; У strict режиму: undefined
      
    • Позив као метода објекта:
      • this се односи на објекат којем припада метода.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • Позив са new (конструктор):
      • Креира нови објекат, који постаје вредност this унутар конструкторске функције, и враћа тај објекат.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Јасно навођење контекста (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Позива функцију са датим this и аргументима наведеним посебно.
      • apply(thisArg, [argsArray]): Позива функцију са датим this и аргументима у низу.
      • bind(thisArg, arg1, arg2, ...): Враћа нову функцију, чији је this заувек повезан са thisArg и аргументима.
      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é funkcie: Nemajú vlastný this. Zachytávajú this z okolia, v ktorom boli definované.
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` tu odkazuje na `obj`
        setTimeout(() => {
          // `this` tu tiež odkazuje na `obj` (zdedené z `sayLater`)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David