Sobes.tech
Middle

дар бораи контексти функсияҳо дар JavaScript гап зан.

sobes.tech AI

Ҷавоб аз AI

Контекстът на изпълнение (this) в JavaScript определя как се извиква функцията и какви стойности са достъпни вътре в нея. Контекстът се променя динамично в зависимост от начина на извикване:

  • Глобален контекст: извън функции, this се отнася за глобалния обект (window в браузър, global в Node.js).
    // В браузър
    console.log(this === window); // true
    
    // В Node.js
    console.log(this === global); // true
    
  • Контекст на функция:
    • Стандартно извикване: В нестрог режим this се отнася за глобалния обект (ако функцията не е метод на обект). В строг режим ("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?
      
  • Стрелкови функции: Не имат собствен this. Те улавят this от обкръжаващата лексикална област (там, където са дефинирани).
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` тук се отнася за `obj`
        setTimeout(() => {
          // `this` тук също се отнася за `obj` (наследено от `sayLater`)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David