Поведение функций со стрелками и обычных функций для этого ключевого слова
В JavaScript поведение ключевого слова this отличается для функций со стрелками и обычных функций.
- Ключевое слово this в функциях Arrow имеет лексическую привязку, что означает, что оно берет значение this из окружающего контекста, в котором была определена функция, а не из того места, где она вызывается.В обычных функциях это динамически привязывается в зависимости от того, как вызывается функция (например, в объектном методе это относится к объекту).
это в обычных функциях
Обычные функции определяют для этого свой собственный контекст, основанный на том, как они вызываются. Это относится к объекту, который вызывает функцию, или к глобальному объекту (в нестрогом режиме), если функция вызывается в глобальном контексте
1. Контекст метода: Когда обычная функция вызывается как метод объекта, это относится к объекту, которому принадлежит этот метод.
Output
Object
- obj - это объект с именем свойства и методом getName.getName использует this.name для возврата значения свойства name.Когда вызывается obj.getName(), это значение внутри метода ссылается на объект obj.Метод возвращает "Object", который является значением параметра obj.name.
2. Контекст автономной функции: Когда обычная функция вызывается как автономная функция, это относится к глобальному объекту (window в браузерах, global в Node.js). В строгом режиме это не определено.
Output
<ref *1> Object [global] { global: [Circular *1], clearInterval: [Function: clearInterval], clearTimeout: [Function: clearTimeout], setInterval: [Function: setInterval], setTimeout: [Functio...
- Функция showThis() регистрирует значение параметра this.В нестрогом режиме это относится к глобальному объекту (например, window в браузерах).В строгом режиме это значение не определено внутри функции.
Динамическая привязка: обычные функции позволяют явно задавать значение this с помощью таких методов, как call, apply или bind.
Output
Hello, my name is GFG Hello, my name is GFG Hello, my name is GFG
- call: Вызывает функцию greet и явно присваивает ее объекту person.apply: Аналогично call, но аргументы передаются в виде массива (здесь дополнительные аргументы не передаются).bind: Возвращает новую функцию, которая постоянно привязана к объекту person. Новая функция (greetAlice) может быть вызвана позже.
это в функциях со стрелками
Функции со стрелками, представленные в ES6, ведут себя по-другому. Они не определяют свой собственный контекст this. Вместо этого они наследуют его из окружающей лексической области во время своего создания.
1. Лексическая область видимости: В функции arrow это определяется контекстом, в котором определена функция, а не местом ее вызова.
Output
undefined
Здесь это относится к глобальному объекту, потому что функция arrow не привязывает свой собственный this.
2. Полезно при обратных вызовах: функции со стрелками особенно полезны при обратных вызовах, где вы хотите сохранить этот контекст охватывающей области.
Функция arrow внутри setInterval наследует это от конструктора Timer, гарантируя, что она ссылается на экземпляр Timer.
Ключевые отличия
Примечание: Разница между обычными функциями и функциями со стрелками
Лучшие практики
- Понимайте контекст: всегда помните о области, в которой работает ваша функция. Используйте обычные функции для сценариев, требующих динамической привязки this, и функции со стрелками для обеспечения согласованности с охватывающей лексической областью.Выберите правильный тип функции: используйте обычные функции в объектных методах или при использовании наследования в классах. Используйте функции со стрелками в обратных вызовах, обработчиках событий или функциях более высокого порядка.Избегайте использования функций со стрелками в качестве методов: поскольку функции со стрелками не имеют собственного this, избегайте их использования в объектных методах, если вам это нужно для ссылки на объект.Используйте инструменты, подобные ESLint, для обеспечения согласованного и надлежащего использования типов функций в вашей кодовой базе.
Поведение функций со стрелками и обычных функций для этого ключевого слова - Часто задаваемые вопросы
Почему в функциях со стрелками это происходит по-другому?
Функции со стрелками разработаны таким образом, чтобы наследовать это от их лексической области видимости, что делает их идеальными для сценариев, в которых вы хотите сохранить контекст окружающего кода.
Могу ли я использовать функции со стрелками в качестве объектных методов?
Хотя это возможно, не рекомендуется, если метод основан на ссылке this на объект. В таких случаях вместо этого используйте обычные функции.
Как я могу явно задать это в функции со стрелкой?
Вы не можете явно задать это в функции arrow, поскольку она не привязывает свое собственное значение this. Вместо этого она всегда наследуется от охватывающей области.
Когда мне следует избегать функций со стрелками?
Избегайте функций со стрелками при создании объектных методов, функций конструктора или любого другого сценария, требующего динамической привязки.
Similar Reads
- JavaScript | Split a string with multiple separatorsGiven a statement which contains the string and separators, the task is to split the string into substring.String split() Method: The str.split() function is used to split the given string into array of strings by separating it into substrings using a specified separator provided in the argument. Sy3 min read
- JavaScript String substring() MethodThe substring() method in JavaScript is used to extract characters between two indices from a string, without modifying the original string. This method returns a new string that is a part of the original string, starting from a specified position up to (but not including) another specified position5 min read
- TypeScript String split() MethodThe TypeScript split() method divides a string into an array of substrings using a specified separator, a string, or a regular expression. It optionally accepts a limit to determine the maximum number of splits. This method is commonly used for string manipulation. Syntax string.split([separator][,3 min read
- Scala SortedSet mkString() method with a separator with exampleThe mkString() method is utilized to display all the elements of the SortedSet in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the SortedSet in a string along with a separator. Example #1: // Scala program of mkStri1 min read
- Scala Set mkString() method with a separator with exampleThe mkString() method is utilized to display all the elements of the set in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the set in a string along with a separator. Example #1: // Scala program of mkString() // meth1 min read
- Scala Stack mkString() method with a separator with exampleIn Scala Stack class, the mkString() method is utilized to display all the elements of the stack in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the stack in a string along with a separator. Example #1: // Scala pro1 min read
- Scala List mkString() method with a separator with exampleThe mkString() method is utilized to display all the elements of the list in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the list in a string along with a separator. Example #1: // Scala program of mkString() // me1 min read
- Scala TreeSet mkString() method with a separator with exampleThe mkString() method is utilized to display all the elements of the TreeSet in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the TreeSet in a string along with a separator. Example #1: // Scala program of mkString()1 min read
- Scala Queue mkString() method with a separator with exampleThe mkString() method is utilized to display all the elements of the queue in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the queue in a string along with a separator. Example #1: // Scala program of mkString() //1 min read
- Scala immutable TreeSet mkString() method with a separatorIn Scala immutable TreeSet class the mkString() method is utilised to display all the elements of the TreeSet in a string along with a separator. Method Definition: def mkString(sep: String): String Return Type: It returns all the elements of the TreeSet in a string along with a separator. Example #1 min read
- Scala List mkString() method with a start, a separator and an end with exampleThis method is same as mkString() method but here a start, a separator and an end is also included. Method Definition: defmkString(start: String, sep: String, end: String): String Return Type: It returns the elements of the list as a string along with a stated start, separator and an end. Let's chec1 min read
- Scala Iterator mkString() method with a separator with exampleThis method is same as mkString() method but here a separator is included. Method Definition: def mkString(sep: String): String Return Type: It returns the string representation of the stated collection with a given separator. Example #1: // Scala program of mkString() // method with a separator //1 min read
- Scala Iterator mkString() method with a start, a separator and an end with exampleThis method is also same as mkString() method but here it is accompanied by a start, a separator and an end. Method Definition: def mkString(start: String, sep: String, end: String): String Where, start is the starting string, sep is the separator string and end is the ending string. Return Type: It1 min read
- Scala Map mkString() method with a start, a separator and an end with exampleThis method is same as mkString() but here a start, a separator, and an end is also added. Method Definition: defmkString(start: String, sep: String, end: String): String Return Type: It returns the elements of the map as a string along with a stated start, separator and an end. Example #1: // Scala1 min read
- Scala Map mkString() method with a separator with exampleThis method is same as mkString() method but here a separator is also added. Method Definition: def mkString(sep: String): String Return Type: It returns the elements of the map as a string along with the separator between them. Example #1: // Scala program of mkString() // method with a separator /1 min read
- Scala SortedSet mkString() method with exampleThe mkString() method is utilized to display all elements of the SortedSet in a string. Method Definition: def mkString: String Return Type: It returns a string containing all the element of the SortedSet. Example #1: // Scala program of mkString() // method import scala.collection.immutable.SortedS1 min read
- Scala Set mkString() method with exampleThe mkString() method is utilized to display all elements of the set in a string. Method Definition: def mkString: String Return Type: It returns a string containing all the element of the set. Example #1: // Scala program of mkString() // method // Creating object object GfG { // Main method def ma1 min read
- Scala List addString() method with a separator with exampleThis method is same as addString() method but here a separator is also included. Method Definition: def addString(b: StringBuilder, sep: String): StringBuilder Return Type: It returns the elements of the list to a string builder along with a separator between them. Example #1: // Scala program of ad1 min read
- Scala Stack mkString() method with exampleIn Scala Stack class, the mkString() method is utilized to display all elements of the stack in a string. Method Definition: def mkString: String Return Type: It returns a string containing all the element of the stack. Example #1: // Scala program of mkString() // method // Import Stack import scal1 min read