Sobes.tech
Junior

თუ თქვენ console.log-ში this-ს გამოიყენებთ, რა გამოვა კონსოლში?

sobes.tech AI

პასუხი AI-სგან

კონტექსტზე და JavaScript-ის მკაცრ რეჟიმზე ("use strict") დამოკიდებულია console.log-ის გამოძახების კონტექსტი.

გლობალურ კონტექსტში (ფუნქციებისა და მოდულების გარეთ):

  • ნესტრიქტულ რეჟიმში ("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 (მემკვიდრეობით გამოყოფის კონტექსტიდან)