Junior
JavaScriptте функциянын контекстин кантип өзгөртсө болот?
sobes.tech AI
AIден жооп
JavaScriptте функциянын ишке ашуу контексти (бул this мааниси) бир нече жол менен өзгөртүлүшү мүмкүн:
-
call(): Функцияны белгиленгенthisмааниси жана аргументтери менен, аларды жеке-жеке, үтір менен бөлүп өткөрүү менен иштетет.// function.call(thisArg, arg1, arg2, ...) function greet(name) { console.log(`Салам, ${name}! Мен ${this.type}`); } const obj = { type: 'объект' }; greet.call(obj, 'Алиса'); // Салам, Алиса! Мен объект -
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 -
bind(): Жаңы функция түзөт, ал белгиленгенthisмаанисине "байланышкан". Оригиналдуу функция дароо ишке киргизилбейт.// function.bind(thisArg, arg1, arg2, ...) const user = { name: 'Боб' }; function sayHello() { console.log(`Менин атым ${this.name}`); } const boundSayHello = sayHello.bind(user); boundSayHello(); // Менин атым Боб -
Нителдик функциялар (
=>): Алар өзүнүн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 (контекст жоголду)