Maison > interface Web > Questions et réponses frontales > Que signifie la flèche du signe égal es6 ?

Que signifie la flèche du signe égal es6 ?

青灯夜游
Libérer: 2022-10-25 20:43:06
original
1443 Les gens l'ont consulté

La flèche de signe égal "=>" dans

es6 fait référence à la fonction flèche, qui est un raccourci pour une fonction. La syntaxe est (paramètre)=>{corps de fonction};". La syntaxe des expressions de fonction flèche est. mieux que celui des expressions de fonction Plus concis, il n'y a pas de liaison entre this, super, arguments et new.target, il ne peut pas être appelé via le nouveau mot-clé, et la liaison de this ne peut pas être modifiée

Que signifie la flèche du signe égal es6 ?

Le fonctionnement. environnement de ce tutoriel : système Windows 7, ECMAScript version 6, ordinateur Dell G3

=> est une fonction flèche, une nouvelle fonction ajoutée dans la norme ES6. La fonction flèche est une nouvelle fonction qui utilise des flèches (=>). La syntaxe de l'expression de la fonction flèche est plus concise que celle de l'expression de la fonction, mais elle est légèrement différente de la fonction JavaScript traditionnelle, se concentrant principalement sur les aspects suivants : =>是箭头函数,是ES6标准中新增的一种新的函数。顾名思义,箭头函数是一种使用箭头(=>)定义函数的新语法,箭头函数表达式的语法比函数表达式更简洁,但是它与传统的JavaScript函数有些许不同,主要集中在以下方面:

  • 没有this、super、arguments和new.target绑定,其值由外围最近一层非箭头函数决定

  • 不能通过new关键字调用

  • 没有原型

  • 不可以改变this的绑定

  • 不支持arguments对象

  • 不支持重复的命名参数

  • 函数体内的this的指向始终是指向定义它所在的对象,而不会指向调用它的对象,我们知道es5中的函数是谁执行它,它就指向谁。

执行环境

你可以自己去学习和尝试下, 你可以简单的把示例程序代码复制到你的浏览器控制台下. 现在, 推荐使用Firefox(22+)开发者工具, Firefox(22+)开发者工具现在支持箭头函数,你也可以使用谷歌浏览器. 如果你使用谷歌浏览器, 你必须要做下列两件事:

  • 在谷歌浏览器中地址栏中输入:about:flags, 找到 "使用体验性JavaScript"选项,开启使用。

  • 在函数的开头加上use strict,然后再在你的谷歌浏览中测试箭头函数吧(提示:请用谷歌浏览器v38,我当时就是被浏览器版本坑了):

(function(){
    "use strict";
    // use arrow functions here
}());
Copier après la connexion

幸运的是后面会有越来越多的浏览器支持ES6特性. 现在你完成了所有准备工作, 让我们继续深入它吧!

一个新话题

最近大家在讨论关于ES6的一个话题:关于箭头函数, 像这样:

=>
Copier après la connexion

新的语法

随着讨论产生了一个新的语法:

param => expression
Copier après la connexion

新增的语法是作用在变量上, 可以在表达式中申明多个变量, 下面是箭头函数的使用模式:

//  一个参数对应一个表达式
param => expression;// 例如 x => x+2;

// 多个参数对应一个表达式
(param [, param]) => expression; //例如 (x,y) => (x + y);

// 一个参数对应多个表示式
param => {statements;} //例如 x = > { x++; return x;};

//  多个参数对应多个表达式
([param] [, param]) => {statements} // 例如 (x,y) => { x++;y++;return x*y;};

//表达式里没有参数
() => expression; //例如var flag = (() => 2)(); flag等于2
() => {statements;} //例如 var flag = (() => {return 1;})(); flag就等于1

//传入一个表达式,返回一个对象
([param]) => ({ key: value });
//例如  var fuc = (x) => ({key:x})
        var object = fuc(1);
        alert(object);//{key:1}
Copier après la connexion

箭头函数是怎么实现的

我们可以把一个普通函数转换成用箭头函数来实现:

// 当前函数
var func = function (param) {
    return param.split(" ");
}
// 利用箭头函数实现
var func = param => param.split(" ");
Copier après la connexion

从上面的例子中我们可以看出箭头函数的语法实际上是返回了一个新的函数, 这个函数有函数体和参数。

因此, 我们可以这样调用刚才我们创建的函数:

func("Felipe Moura"); // returns ["Felipe", "Moura"]
Copier après la connexion

立即执行函数(IIFE)

你能在立即执行函数里使用箭头函数,例如:

( x => x * 2 )( 3 ); // 6
Copier après la connexion

这行代码产生了一个临时函数,这个函数有一个形参x,函数的返回值为x*2,之后系统会马上执行这个临时函数, 将3赋值给形参x.

下面的例子描述了临时函数体里有多行代码的情况:

( (x, y) => {
    x = x * 2;
    return x + y;
})( 3, "A" ); // "6A"
Copier après la connexion

相关思考

思考下面的函数:

var func = x => {
    return x++;
};
Copier après la connexion

我们列出了一些常见的问题:

箭头函数创建的临时函数的arguments它不会被置:

console.log(arguments); // not defined
Copier après la connexion

typeofinstanceof函

  • Il n'y a pas de liaison entre les arguments this, super, et new.target, et sa valeur est déterminée par la fonction non-flèche la plus proche en périphérie

  • Ne peut pas être appelé via le nouveau mot-clé

  • Il n'y a pas de prototype

  • Impossible de modifier la liaison de ceci

  • Ne prend pas en charge les objets arguments
  • Ne prend pas en charge les paramètres nommés répétés
  • Ceci dans le corps de la fonction pointe toujours vers l'objet dans lequel il est défini, pas vers l'objet qui appelle Nous savons que celui qui exécute la fonction dans es5 y pointera du doigt

Environnement d'exécution

Vous pouvez l'apprendre et l'essayer vous-même. Vous pouvez simplement copier l'exemple de code du programme sur votre. console du navigateur. Désormais, il est recommandé d'utiliser Firefox (22+) pour le développement. Les outils de développement de Firefox (22+) prennent désormais en charge les fonctions de flèche et vous pouvez également utiliser Google Chrome. Si vous utilisez Google Chrome, vous devez effectuer les deux choses suivantes. :

  • Entrez : about:flags dans la barre d'adresse de Google Chrome, recherchez l'option "Utiliser JavaScript expérientiel" et activez-la 🎜
  • 🎜Ajouter au début de la fonction Allez utiliser strict, puis testez la fonction flèche dans votre Google Chrome (astuce : merci d'utiliser Google Chrome v38, je me suis fait avoir par la version du navigateur à l'époque) : 🎜
func instanceof Function; // true
typeof func; // function
func.constructor == Function; // true
Copier après la connexion
🎜Lucky De plus en plus de navigateurs prendront en charge les fonctionnalités ES6 à l'avenir. Maintenant que vous avez terminé tout le travail de préparation, continuons à nous y plonger 🎜🎜🎜🎜Un nouveau sujet🎜🎜🎜. 🎜Un sujet sur ES6 a été abordé récemment : Concernant les fonctions fléchées, comme ceci : 🎜
//  有效的常规语法
(function (x, y){
    x= x * 2;
    return x + y;
} (3, "B") );
// 无效的箭头函数语法
( (x, y) => {
    x= x * 2;
    return x + y;
} ( 3, "A" ) );
// 但是可以这样写就是有效的了:
( (x,y) => {
    x= x * 2;return x + y;
} )( 3,"A" );//立即执行函数
Copier après la connexion
🎜🎜🎜Nouvelle syntaxe🎜🎜🎜🎜Avec la discussion, une nouvelle syntaxe est née : 🎜
var instance= new func(); // TypeError: func is not a constructor
Copier après la connexion
🎜La nouvelle syntaxe est appliquée aux variables, et plusieurs déclarations peuvent être déclarées dans des variables d'expression, voici le modèle d'utilisation de la fonction flèche : 🎜
func.prototype; // undefined
Copier après la connexion
🎜🎜🎜Comment la fonction flèche est implémentée🎜🎜
🎜🎜Nous pouvons convertir une fonction ordinaire en fonction flèche à implémenter :
🎜
document.body.addEventListener('click', function(evt){
    console.log(this); // the HTMLBodyElement itself
});
Copier après la connexion
🎜Dans l'exemple ci-dessus, nous pouvons voir que la syntaxe de la fonction flèche renvoie en fait une nouvelle fonction, qui a un corps de fonction et des paramètres. 🎜🎜Par conséquent, nous pouvons appeler la fonction que nous venons de créer comme ceci :🎜
function Person () {
    let fullName = null;
    this.getName = function () {
        return fullName;
    };
    this.setName = function (name) {
        fullName = name;
        return this;
    };
}
let jon = new Person();
jon.setName("Jon Doe");
console.log(jon.getName()); // "Jon Doe"
//注:this关键字这里就不解释了,大家自己google,baidu吧。
Copier après la connexion
🎜🎜🎜Fonction d'exécution immédiate (IIFE)🎜🎜🎜🎜Vous pouvez utiliser des fonctions fléchées dans les fonctions d'exécution immédiate, par exemple :🎜
jon.setName("Jon Doe")
.getName(); // "Jon Doe"
Copier après la connexion
🎜Cette ligne de code génère Une fonction temporaire. Cette fonction a un paramètre formel x, et la valeur de retour de la fonction est x*2 Le système exécutera immédiatement cette fonction temporaire et attribuera 3 au paramètre formel Situation de code multiligne : 🎜
let obj = {
    foo: "bar",
    getIt: function () {
        return this.foo;
    }
};
console.log( obj.getIt() ); // "bar"
Copier après la connexion
Copier après la connexion
🎜🎜. 🎜 Réflexions connexes 🎜🎜🎜🎜 Considérez la fonction suivante : 🎜
function Student(data){
    this.name = data.name || "Jon Doe";
    this.age = data.age>=0 ? data.age : -1;
    this.getInfo = function () {
        return this.name + ", " + this.age;
    };
    this.sayHi = function () {
        window.setTimeout( function () {
            console.log( this );
        }, 100 );
    }
}

let mary = new Student({
    name: "Mary Lou",
    age: 13
});
console.log( mary.getInfo() ); // "Mary Lou, 13"
mary.sayHi();
// window
Copier après la connexion
Copier après la connexion
🎜 Nous avons répertorié quelques problèmes courants : 🎜🎜Les arguments des fonctions temporaires créées par les fonctions fléchées ne seront pas définis : 🎜
function Student(data){
    this.name = data.name || "Jon Doe";
    this.age = data.age>=0 ? data.age : -1;
    this.getInfo = function () {
        return this.name + ", " + this.age;
    };
    this.sayHi = function () {
        window.setTimeout( ()=>{
            // the only difference is here
            console.log( this );
        }, 100 );
    }
}

let mary = new Student({
    name: "Mary Lou",
    age: 13
});
console.log( mary.getInfo() ); // "Mary Lou, 13"
mary.sayHi();
// Object { name: "Mary Lou", age: 13, ... }
Copier après la connexion
Copier après la connexion
🎜typeof et < code>instanceof function peut également vérifier les fonctions temporaires normalement : 🎜
var arr = ['a', 'e', 'i', 'o', 'u'];
arr.forEach(vowel =&gt; {
    console.log(vowel);
});
Copier après la connexion
Copier après la connexion
🎜Mettre les fonctions fléchées entre parenthèses n'est pas valide : 🎜
//在Array.map里使用箭头函数,这里我就不分析函数执行过程了。。。。

var arr = ['a', 'e', 'i', 'o', 'u'];
arr.map(vowel =&gt; {
    return vowel.toUpperCase();
});
// [ "A", "E", "I", "O", "U" ]
Copier après la connexion
Copier après la connexion
🎜Bien que les fonctions fléchées génèrent une fonction temporaire, mais cette fonction temporaire n'est pas un constructeur : 🎜
var factorial = (n) =&gt; {
    if(n==0) {
        return 1;
    }
    return (n * factorial (n-1) );
}
factorial(6); // 720
Copier après la connexion
Copier après la connexion
🎜 Il n'y a pas non plus d'objet prototype : 🎜
let arr = ['a', 'e', 'i', 'o', 'u'];
arr.sort( (a, b)=&gt; a < b? 1: -1 );
Copier après la connexion
Copier après la connexion
🎜🎜🎜Scope🎜🎜🎜🎜La portée de cette fonction flèche est quelque peu différente des autres fonctions, sinon strictement Mode, ce mot-clé pointe vers window, le mode strict n'est pas défini, ceci dans le constructeur pointe vers l'instance d'objet actuelle, si elle se trouve dans une fonction d'un objet, cela pointe vers l'objet, cela peut pointer vers un élément DOM, par exemple, lorsque nous ajoutons une fonction d'écoute d'événement, le pointage de ceci peut ne pas être très direct. En fait, le pointage de cette variable (pas seulement de cette variable) est jugé selon une règle : le flux de portée. Ci-dessous, je vais montrer comment cela apparaît dans la fonction d'écoute d'événement et dans la fonction d'objet : 🎜🎜 Dans la fonction d'écoute d'événement : 🎜
// EventObject, BodyElement
document.body.addEventListener('click', event=&gt;console.log(event, this));
Copier après la connexion
Copier après la connexion
🎜 Dans le constructeur : 🎜rrreee🎜 Dans cet exemple, si nous laissons la fonction Person.setName renvoyer Le Objet personne lui-même, on peut l'utiliser comme ceci :🎜rrreee🎜Dans un objet :🎜
let obj = {
    foo: "bar",
    getIt: function () {
        return this.foo;
    }
};
console.log( obj.getIt() ); // "bar"
Copier après la connexion
Copier après la connexion

但是当执行流(比如使用了setTimeout)和作用域变了的时候,this也会变。

function Student(data){
    this.name = data.name || "Jon Doe";
    this.age = data.age>=0 ? data.age : -1;
    this.getInfo = function () {
        return this.name + ", " + this.age;
    };
    this.sayHi = function () {
        window.setTimeout( function () {
            console.log( this );
        }, 100 );
    }
}

let mary = new Student({
    name: "Mary Lou",
    age: 13
});
console.log( mary.getInfo() ); // "Mary Lou, 13"
mary.sayHi();
// window
Copier après la connexion
Copier après la connexion

当setTimeout函数改变了执行流的情况时,this的指向会变成全局对象,或者是在严格模式下就是undefine,这样在setTimeout函数里面我们使用其他的变量去指向this对象,比如self,that,当然不管你用什么变量,你首先应该在setTimeout访问之前,给self,that赋值,或者使用bind方法不然这些变量就是undefined。

这是后就是箭头函数登场的时候了,它可以保持作用域,this的指向就不会变了。

让我们看下上文起先的例子,在这里我们使用箭头函数:

function Student(data){
    this.name = data.name || "Jon Doe";
    this.age = data.age>=0 ? data.age : -1;
    this.getInfo = function () {
        return this.name + ", " + this.age;
    };
    this.sayHi = function () {
        window.setTimeout( ()=&gt;{
            // the only difference is here
            console.log( this );
        }, 100 );
    }
}

let mary = new Student({
    name: "Mary Lou",
    age: 13
});
console.log( mary.getInfo() ); // "Mary Lou, 13"
mary.sayHi();
// Object { name: "Mary Lou", age: 13, ... }
Copier après la connexion
Copier après la connexion

分析:在sayHi函数中,我们使用了箭头函数,当前作用域是在student对象的一个方法中,箭头函数生成的临时函数的作用域也就是student对象的sayHi函数的作用域。所以即使我们在setTimeout调用了箭头函数生成的临时函数,这个临时函数中的this也是正确的指向。

有趣和有用的使用

创建一个函数很容易,我们可以利用它可以保持作用域的特征:

例如我们可以这么使用:Array.forEach()

var arr = ['a', 'e', 'i', 'o', 'u'];
arr.forEach(vowel =&gt; {
    console.log(vowel);
});
Copier après la connexion
Copier après la connexion

分析:在forEach里箭头函数会创建并返回一个临时函数 tempFun,这个tempFun你可以想象成这样的:function(vowel){ console.log(vowel);}但是Array.forEach函数会怎么去处理传入的tempFunc呢?在forEach函数里会这样调用它:tempFunc.call(this,value);所有我们看到函数的正确执行效果。

//在Array.map里使用箭头函数,这里我就不分析函数执行过程了。。。。

var arr = ['a', 'e', 'i', 'o', 'u'];
arr.map(vowel =&gt; {
    return vowel.toUpperCase();
});
// [ "A", "E", "I", "O", "U" ]
Copier après la connexion
Copier après la connexion

费布拉奇数列

var factorial = (n) =&gt; {
    if(n==0) {
        return 1;
    }
    return (n * factorial (n-1) );
}
factorial(6); // 720
Copier après la connexion
Copier après la connexion

我们也可以用在Array.sort方法里:

let arr = ['a', 'e', 'i', 'o', 'u'];
arr.sort( (a, b)=&gt; a < b? 1: -1 );
Copier après la connexion
Copier après la connexion

也可以在事件监听函数里使用:

// EventObject, BodyElement
document.body.addEventListener('click', event=&gt;console.log(event, this));
Copier après la connexion
Copier après la connexion

总结

尽管大家可能会认为使用箭头函数会降低你代码的可读性,但是由于它对作用域的特殊处理,它能让我们能很好的处理this的指向问题。箭头函数加上let关键字的使用,将会让我们JavaScript代码上一个层次!尽量多使用箭头函数,你可以再你的浏览器测试你写的箭头函数代码,大家可以再评论区留下你对箭头函数的想法和使用方案!我希望大家能享受这篇文章,就像你会不就的将来享受箭头函数带给你的快乐.

更多编程相关知识,请访问:编程入门!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal