Sobes.tech
Junior

Эгер сиз console.log ичинде this колдонсоңуз, консольдо эмне чыгат?

sobes.tech AI

AIден жооп

console.log-ту чакырган контекстке жана катуу режимдин ("use strict") жараша болот.

Глобалдык контекстте (функциялар жана модулдар сыртында):

  • Нестриктүү режимде ("use strict" жок же функцияда жарыяланган): this глобалдык объектке шилтеме кылат (window браузерде, global Node.js).
  • Катуу режимде: this undefined болот.

Функциянын ичинде:

  • Нестриктүү режимде: this глобалдык объектке шилтеме кылат, эгер функция жөнөкөй функция катары чакырылса (myFunction()). Эгер функция объекттин методу катары чакырылса (myObject.myMethod()), this объектке шилтеме кылат (myObject). Эгер функция конструктор катары колдонулса (new MyClass()), this жаңы объектке шилтеме кылат.
  • Катуу режимде: this undefined болот, эгер функция жөнөкөй функция катары чакырылса. Башка учурларда (объекттин методу, конструктор) жүрүм-турум ошол эле бойдон калат, какта нестриктүү режимде.

Стрелка функциясынын ичинде (=>):

  • this лексикалык жактан сырттагы контексттен мурас алат. Демек, стрелка функциясынын ичинде this мааниси сырттагы жөнөкөй функция же глобалдык контекстте кандай болсо, ошондой болот, чакыруу жолу кандай болбосун. Стрелка функциялары this-ти өзүнүн чакыруу контекстине байламайт.

Мисал:

// Глобалдык контекст
console.log(this); // Браузерде: Window, Node.js: global (нестриктүү режим)
                    // Браузерде: undefined, Node.js: undefined (катуу режим)

// Жөнөкөй функция
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // Браузерде: Window, Node.js: global

function showThisStrict() {
  "use strict";
  console.log(this);
}

showThisStrict(); // undefined

const myObject = {
  methodNonStrict: function() {
    console.log(this);
  },
  methodStrict: function() {
    "use strict";
    console.log(this);
  }
};

myObject.methodNonStrict(); // myObject
myObject.methodStrict();   // myObject

// Стрелка функциясы
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // Браузерде: Window, Node.js: global (сырткы контексттен мурас)

const myObjectWithArrow = {
  arrowMethod: () => {
    console.log(this);
  }
};

myObjectWithArrow.arrowMethod(); // Браузерде: Window, Node.js: global (жарыяланган контексттен мурас)