Ключевое слово this может сбивать с толку при просмотре в JavaScript, и вы, вероятно, отреагируете как мем выше. Как, черт возьми, это это и зачем мне его использовать? Что ж, это важно при использовании объектов в Javascript. Кроме того, всякий раз, когда я использую «это», я выделяю его жирным шрифтом, чтобы вы не запутались в моем буквальном значении этого слова. В любом случае, this используется для обозначения объекта, в котором он находится. Для начала вы увидите, что он используется в конструкторах объектов:

function Dog(name, breed, age) {
  this.name = name;
  this.breed = breed;
  this.age = age;
}
const myDog = new Dog("Marley", "Golden Retriever", 9)

Это функция-конструктор, в которой вы можете создавать новые объекты. В этом контексте this не имеет значения. Он просто используется как замена для последующих создаваемых новых объектов. После этого this становится значением создаваемого нового объекта.

Обычно, кроме функций конструктора, this относится к самому объекту. this получает значение тремя способами:

  1. Привязка по умолчанию

Это в данном случае, когда никакая другая форма привязки не применяется:

function logThis() {     
   console.log("default this", this); 
};  
logThis(); // -> [object Window]

Как видите, this используется в функции. В подобных случаях this просто ссылается на глобальный объект, который представляет собой длинный список ключей и значений, имеющихся в окне. Другими словами, эта функция является привязкой по умолчанию для this.

2. Неявное связывание

Это наиболее распространенный способ использования this.

function myFunc() {     
    console.log( this.prop ); 
}  
let obj1 = {     
    prop: 2,     
    myFunc: myFunc 
}; 
 
obj1.myFunc(); // -> 2

Это получает свое значение, когда объект владеет вызовом функции. Я определил myFunc, который печатает ключ объекта и передал его объекту. Теперь объект владеет этой функцией, которая, в свою очередь, при выполнении будет использовать this и пытаться увидеть, на какой объект она ссылается. В результате будет напечатано 2. Вы также можете думать об этом как о левом от точки, чтобы увидеть, что это может относиться к.

function myFunc() {     
    console.log( this.prop ); 
}
var obj1 = {     
    prop: 1,     
    myFunc: myFunc 
};  
var obj2 = {    
    prop: 2,     
    myFunc: myFunc,     
    obj1: obj1 
};  
obj2.obj1.myFunc(); // -> 1

В этом примере я просто добавил еще один объект, который совпадает с другим объектом, который принимает другой объект. Но теперь obj1 вложен в obj2. Итак, как мы узнаем, что означает this.prop? Ну просто. Вы помните принцип «слева от точки»? В последнем операторе «obj2.obj1.myFunc ()», непосредственно слева от функции, которая содержит «console.log (this.prop)», это obj1! Таким образом, myFunc () будет использовать obj1.prop, а не obj2.prop. В конечном итоге obj1 владеет myFunc ().

3. Явная привязка

Это когда вы указываете функции, что именно вы хотите использовать для этого. Для управления привязкой есть три встроенные функции: вызов, применение и привязка. Но я перейду только к первым двум, позвоню и подам заявку.

Это синтаксис как для вызова, так и для применения:

  • function.call(object, arg1, arg2, ...)
  • function.apply(object, [arg1, arg2, ...])

Позвонить

function greet(greeting, punctuation) {   
    let firstLine = greeting + ', ' + this.name + punctuation;   
    let secondLine = 'You are a great ' + this.occupation + punctuation;   
    return firstLine + ' ' + secondLine; 
}; 
 
let danny = { 
    name: 'Danny',
    occupation: 'Artist' 
};
 
let mikey = { 
    name: 'Mikey', 
    occupation: 'CTO' 
};
  
console.log(greet.call(danny, 'Hello', '!'));
// -> "Hello, Danny! You are a great Artist!"
console.log(greet.call(mikey, 'Hey', '...'));
// -> "Hey, Mikey... You are a great CTO..."

Итак, здесь я использую this.name и this.occupation в определении функции greet. В примере с неявной привязкой я использую функцию greet как ключ к объекту, а здесь - нет. В подобных случаях this в функции не ссылается ни на один объект. Следовательно, вы можете явно связать его с помощью функции вызова. Он принимает объект в качестве первого аргумента, а затем любые оставшиеся аргументы функции, такие как приветствие и знаки препинания.

Применить

function greet(greeting, punctuation) {   
    let firstLine = greeting + ', ' + this.name + punctuation;   
    let secondLine = 'You are a great ' + this.occupation + punctuation;   
    return firstLine + ' ' + secondLine; 
}; 
 
let danny = { 
    name: 'Danny',
    occupation: 'Artist' 
};
 
let mikey = { 
    name: 'Mikey', 
    occupation: 'CTO' 
};
  
console.log(greet.apply(danny, ['Hello', '!']));
// -> "Hello, Danny! You are a great Artist"
console.log(greet.apply(mikey, ['Hey', '...']));
// -> "Hey, Mikey... You are a great CTO..."

Apply буквально то же самое, что call, но с той лишь разницей, что call принимает аргументы отдельно, а apply принимает аргументы как массив. Но функционально они оба дают одинаковый результат.

Заключение

По сути, это очень запутанное понятие для понимания в первую очередь. У этого гораздо больше функциональных возможностей, которые я не рассмотрел, но как только вы получите твердое представление обо всем материале, который я рассмотрел здесь, вы также будете хорошо знакомы с основами того, как это вообще работает.