Quelles sont les différences (le cas échéant) entre ES6 flèche fonctions et les fonctions liées à la Fonction.le prototype.lier?
Il me semble que, dans l'ES6, les deux fonctions suivantes sont très près de identiques:
function () {
return this;
}.bind(this);
() => {
return this;
};
Au final, le résultat semble le même: flèche de fonctions produisent une fonction JavaScript objet this
contexte lié à la même valeur que la this
où ils sont créés.
Évidemment, dans le sens général, Function.prototype.bind
est plus flexible que la flèche fonctions: il peut se lier à des valeurs autres que les locaux this
, et il peut se lier n'importe quelle fonction du this
à n'importe quel point dans le temps, potentiellement longtemps après qu'elle a été initialement créé. Cependant, je ne suis pas demandant comment bind
elle-même est différente de la flèche fonctions, je me demande comment flèche fonctions diffèrent immédiatement appelant bind
avec this
.
Est-il des différences entre les deux concepts dans l'ES6?
- Avec
bind
vous créez essentiellement deux fonctions. Autre que cela, les choses que vous avez mentionnées et le fait que la flèche fonctions ont une syntaxe plus concise, il n'y a pas de différence. - Comme cette question ne cherche pas et il est des réponses n'offrent pas toutes les fois où vous avez une bonne raison d'utiliser
bind
sur une flèche de la fonction, j'ai posé une nouvelle question sur le moment de le faire: runkit.com/embed/yhv29j5sybvn - Double Possible de Flèche en fonction de vs déclaration de fonction / expressions: Sont-ils équivalent / échangeables?
- Dans le
bind
version, il retourne une nouvelle fonction qui applique en partie les arguments debind
. La flèche n'a pasthis
afin que l'utilisation de c'est comme toute variable libre d'une plus haute portée.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas (beaucoup) de différences.
Bon, d'accord, c'est un peu prématuré. Il y a trois minuscule différences unique de flèche fonctions.
Flèche fonctions ne peuvent pas être utilisés avec
new
.Cela signifie, bien sûr, qu'ils n'ont pas de
prototype
de propriété et ne peut pas être utilisé pour créer un objet avec le classique inspiré de la syntaxe.C'est probablement pour le mieux, mais la façon
new
œuvres ne serait pas beaucoup de sens avec les fonctions liées.Flèche fonctions n'ont pas accès à l'spéciale
arguments
objet ordinaire des fonctions JavaScript ont accès.Celui-ci est sans doute un peu plus d'un chat. Sans doute c'est de supprimer l'un des scripts d'autres bizarreries. Le
arguments
objet est sa propre bête, et il a un comportement étrange, il n'est donc pas surprenant qu'il a été jeté.Au lieu de cela, ES6 a splats qui peut accomplir la même chose, sans la magie des variables cachées:
Flèche fonctions n'ont pas leur propre
nouveau.cible
de la propriété, ils utilisent lenew.target
de leur fonction englobante, si elle existe.Ceci est cohérent avec les autres modifications apportées à supprimer "comme par magie" introduit des valeurs de flèche fonctions. Ce changement est particulièrement évident, compte tenu de la flèche fonctions ne peuvent pas être utilisés avec
new
de toute façon, comme mentionné ci-dessus.Sinon, les flèches sont comme les fonctions liées, du point de vue sémantique. Il est possible pour les flèches pour être plus performant, car ils n'ont pas à transporter les bagages supplémentaire et depuis ils n'ont pas besoin d'être converti à partir d'ordinaire, les fonctions de premier abord, mais ils sont sur le plan comportemental exactement la même.
arguments
a été jeté à cause de "comportement étrange" (qui est fixe dans le mode strict de toute façon). Plutôt, flèche fonctions peuvent accéder à leur fonction englobante duarguments
objet, conformément à la façon dont ils accèdent à sonthis
de liaison etnew.target
.arguments
est considérablement étrange: il n'est toujours pas un tableau, un splat est encore plus utile et plus prévisible.Il y a quelques différences:
Flèche fonctions ne peuvent pas être construits. Tout à la fois la flèche de fonctions et les fonctions liées à la fois de ne pas avoir un
.prototype
de la propriété, les anciens ne lève une exception en cas d'appelnew
tandis que le second ignorer la valeur limite et d'appeler leur objectif de la fonction en tant que constructeur (avec l'application partielle lié arguments, tout de même) sur la nouvelle instance.Flèche fonctions n'ont lexicale
arguments
,new.target
etsuper
ainsi (pas seulement lexicalethis
). Un appel à une flèche de la fonction ne pas initialiser l'un de ceux-là, ils sont juste hérité de la fonction de la flèche de la fonction a été définie. Dans un encadrement de la fonction, ils suffit de se référer à des valeurs respectives de la fonction cible.Flèche fonctions ne fait pas de lier un
this
valeur. Plutôt, ils n'en ont pas, et lorsque vous utilisezthis
il est regardé comme un nom de variable dans la portée lexicale. Cela ne vous permettent paresseusement définir une flèche de la fonction tandis quethis
n'est pas encore disponible:Flèche fonctions ne peuvent pas être générateur de fonctions (bien qu'ils puissent retourner générateurs). Vous pouvez utiliser
.bind()
sur un générateur de fonction, mais il n'y a aucune façon de l'exprimer à l'aide d'une flèche fonction.Voici encore une différence subtile:
Flèche fonctions peuvent renvoyer une valeur sans utiliser le "retour" mot-clé, en omettant les accolades {} à la suite de la => immédiatement.