звоните, связывайте и применяйте в JavaScript!
Конечно! Вызов, привязка и применение — это три метода в JavaScript, которые позволяют вам установить значение this
внутри функции. В этой статье мы рассмотрим, что такое this
, почему это важно и как использовать вызов, привязку и применение для управления им.
Что такое this
в JavaScript?
В JavaScript this
относится к объекту, на котором выполняется текущий код. Значение this
может меняться в зависимости от того, как выполняется код, и это является распространенным источником путаницы для многих разработчиков JavaScript.
Например, если у вас есть функция, которая вызывается как метод объекта, this
будет ссылаться на объект, которому принадлежит метод. Вот пример:
const myObject = { myMethod() { console.log(this); } }; myObject.myMethod(); // logs { myMethod: ƒ }
В этом примере this
относится к объекту myObject
, потому что myMethod
вызывается как метод myObject
.
Однако, если вы вызываете ту же функцию без контекста объекта, this
будет ссылаться на глобальный объект window
(или undefined
в строгом режиме):
function myFunction() { console.log(this); } myFunction(); // logs Window (or undefined in strict mode)
В этом примере this
относится к объекту window
, потому что myFunction
не вызывается как метод какого-либо объекта.
Почему this
важно?
Понимание this
важно, потому что оно позволяет писать более гибкий и пригодный для повторного использования код. Управляя значением this
внутри функции, вы можете заставить эту функцию работать с широким спектром различных объектов, а не привязываться к конкретному объекту.
Например, допустим, у вас есть функция, которая вычисляет площадь прямоугольника:
function calculateArea() { return this.width * this.height; }
Эта функция предполагает наличие свойств width
и height
у объекта, для которого она вызывается. Но что, если вы хотите использовать эту функцию с разными объектами, имеющими разные имена свойств?
Используя call
, bind
или apply
, вы можете установить значение this
внутри функции для любого объекта, который вы хотите, независимо от того, какие имена свойств он использует.
Call
Метод call
позволяет вызывать функцию с указанным значением this
и любыми аргументами, которые ожидает функция. Вот пример:
const rectangle = { width: 10, height: 20 }; function calculateArea() { return this.width * this.height; } const area = calculateArea.call(rectangle); console.log(area); // logs 200
В этом примере мы вызываем функцию calculateArea
с объектом rectangle
в качестве значения this
. Это означает, что this.width
и this.height
внутри функции будут ссылаться на свойства width
и height
объекта rectangle
.
const person = { fullName: function () { return this.firstName + " " + this.lastName; }, }; const nees = { firstName: "Nischal", lastName: "Dahal", }; const anki = { firstName: "Ankita", lastName: "Dahal", }; console.log(person.fullName.call(nees)); console.log(person.fullName.call(anki));
Используя call
, мы можем установить значение this
. Первый аргумент — это присваиваемый объект, затем мы можем ввести дополнительные аргументы, которые затем будут использоваться функцией Function
!
const obj = { name: "ankita" }; let greeting = function (a, b) { return `${a} ${this.name}, ${b}`; };
На этот раз наша функция имеет 2 parameters
, мы можем сначала назначить наш объект, а затем предоставить наш аргумент.
console.log(greeting.call(obj, "Hello", "How are you"));
Применять
Метод apply
аналогичен методу вызова the only difference is that the call method takes arguments separately via comma(,) where as the apply will takes arguments as an array
.
console.log(greeting.call(obj, ["Hello", "How are you !"])); // Hello ankita, How are you !
Итак, при работе с массивами вы хотели бы использовать apply! здесь у меня есть несколько интересных вещей, которые вы можете сделать с помощью метода apply. например, массивы JavaScript не имеют метода max
,
console.log(Math.max(1,3,4)) // 4
Что, если у нас есть массив чисел, и мы хотим получить от него максимальное значение, мы могли бы использовать apply.
const numbers = [1,2,4,5,6,7,8]; console.log(Math.max.apply(null, numbers)); // 8
Здесь мы ничего не присваиваем ключевому слову this, поэтому мы передаем объект как null и аргумент с массивами чисел!
Bind
Метод связывания создает новую связанную функцию, которая wraps
выполняет функцию original
с object
, поэтому здесь мы, по сути, создаем новую функцию bound
для obj
, а затем вызываем функцию вместе с нашей arguments
.
const obj = { name: "ankita" }; let greeting = function (a, b) { return `${a} ${this.name}, ${b}`; }; let bound = greeting.bind(obj); console.log(bound("Hello", "How are you!")); // Hello ankita, How are you ?
Метод bind
похож на call
, но вместо немедленного вызова функции он возвращает новую функцию со значением this
и любыми предварительно установленными аргументами. Вот пример:
const rectangle = { width: 10, height: 20 }; function calculateArea() { return this.width * this.height; } const boundCalculateArea = calculateArea.bind(rectangle); const area = boundCalculateArea(); console.log(area); // logs 200
В этом примере мы создаем новую функцию с именем boundCalculateArea
и передаем ей прямоугольник объекта!
Магический раздел:
const fn = Function.bind.bind(Function.call); fn(console.log("hello world")); // hello world fn(alert("hello from neeswebservices!")); // hello from neeswebservices export const c = console.log.bind(console); c('Hello Nischal'); // Hello Nischal function random() { alert(this.foo); } var bb = Function.bind.bind(Function.call); var randomcall = bb(random); randomcall({ foo: "hello world" }); // alerts "hello world" var uncurryThis = Function.bind.bind(Function.call); var uc = uncurryThis(String.prototype.toUpperCase); console.log(uc("hello")) // in contrast to "hello".toUpperCase() HELLO
то же самое у нас:
Function.bind.bind(Function.call) // return new Function.bind with its `this` is replaced by `Function.call`
Спасибо, что нашли время прочитать мою статью! Надеюсь, вы нашли его информативным и полезным. Если у вас есть какие-либо вопросы или отзывы, пожалуйста, не стесняйтесь обращаться ко мне. Ваша поддержка и участие очень ценятся!
Дайте ХЛОП 👏, если вам помог контент!
- связаться : [email protected]
- Инстаграм: https://instagram.com/neeswebservices
- Гитхаб: https://github.com/neeswebservices
- фейсбук: https://facebook.com/102.nees.418
Это мой первый блог, отзывы принимаются, если они у вас есть 💗.
Читать далее…