Ключевое слово 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 получает значение тремя способами:
- Привязка по умолчанию
Это в данном случае, когда никакая другая форма привязки не применяется:
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 принимает аргументы как массив. Но функционально они оба дают одинаковый результат.
Заключение
По сути, это очень запутанное понятие для понимания в первую очередь. У этого гораздо больше функциональных возможностей, которые я не рассмотрел, но как только вы получите твердое представление обо всем материале, который я рассмотрел здесь, вы также будете хорошо знакомы с основами того, как это вообще работает.