Sobes.tech
Junior

JavaScriptте функциянын контекстин кантип өзгөртсө болот?

sobes.tech AI

AIден жооп

JavaScriptте функциянын ишке ашуу контексти (бул this мааниси) бир нече жол менен өзгөртүлүшү мүмкүн:

  1. call(): Функцияны белгиленген this мааниси жана аргументтери менен, аларды жеке-жеке, үтір менен бөлүп өткөрүү менен иштетет.

    // function.call(thisArg, arg1, arg2, ...)
    function greet(name) {
      console.log(`Салам, ${name}! Мен ${this.type}`);
    }
    
    const obj = { type: 'объект' };
    
    greet.call(obj, 'Алиса'); // Салам, Алиса! Мен объект
    
  2. apply(): Функцияны белгиленген this мааниси жана аргументтери массив же массив окшош объект түрүндө өткөрүлөт.

    // function.apply(thisArg, [argsArray])
    function sum(a, b) {
      console.log(`${this.name}: ${a + b}`);
    }
    
    const context = { name: 'Калькулятор' };
    const numbers = [5, 10];
    
    sum.apply(context, numbers); // Калькулятор: 15
    
  3. bind(): Жаңы функция түзөт, ал белгиленген this маанисине "байланышкан". Оригиналдуу функция дароо ишке киргизилбейт.

    // function.bind(thisArg, arg1, arg2, ...)
    const user = { name: 'Боб' };
    
    function sayHello() {
      console.log(`Менин атым ${this.name}`);
    }
    
    const boundSayHello = sayHello.bind(user);
    
    boundSayHello(); // Менин атым Боб
    
  4. Нителдик функциялар (=>): Алар өзүнүн this ээси эмес. Алар лексикалык чөйрөдөн (this) алат.

    class MyClass {
      constructor() {
        this.value = 'класс мааниси';
        // Нителдик функция класс контекстин сактайт
        this.logValue = () => {
          console.log(this.value);
        };
      }
    }
    
    const instance = new MyClass();
    const method = instance.logValue;
    
    method(); // класс мааниси (контекст сакталган)
    
    // Жөнөкөй функция менен салыштырып көрүңүз, bind колдонулбаган
    class AnotherClass {
        constructor() {
            this.value = 'башка мааниси';
            this.logValue = function() {
                console.log(this.value); // 'this' болот window же strict режимде undefined
            };
        }
    }
    
    const anotherInstance = new AnotherClass();
    const anotherMethod = anotherInstance.logValue;
    
    anotherMethod(); // undefined (контекст жоголду)