,,深入理解JavaScript中的箭头函数

,,深入理解JavaScript中的箭头函数

本文主要介绍对JavaScript中箭头函数的深入理解。主要讲解ES6版本的JS,有需要的朋友可以参考一下。

Arrow从一开始就是JavaScript的一部分。在第一个JavaScript中,建议将内联脚本代码包装在HTML注释中,这样可以防止不支持JavaScript的浏览器错误地将您的代码显示为纯文本。也许您已经编写了以下代码:

脚本语言='javascript '

!-

document.bgColor=' brown//红色

//-

/脚本

脚本语言='javascript '

!-

document.bgColor=' brown//红色

//-

/脚本

旧浏览器会看到两个不支持的标签和一个注释,只有支持JavaScript的新浏览器会将其解析成JavaScript代码。

为了支持这个古怪的特性,浏览器的JavaScript引擎把!——作为单行评论的开头,这不是开玩笑。这一直是这种语言的一部分,今天仍然可以使用,不仅在script标记的第一行,而且在JavaScript代码的任何部分。它甚至可以用于节点。

巧合的是,这种风格的注释在ES6中第一次被标准化。但这不是我们将要讨论的箭头。

-也表示单行注释。与HTML不同,在HTML中,在-之前的部分是注释内容,而在JavaScript中,在-之后的一行是注释。

只有当-出现在行首时,才表示箭头是注释,因为在其他情况下,-是运算符(goes to)。

功能倒计时(n) {

而(n - 0) //'n变为零'

警报(n);

blastoff();

}

功能倒计时(n) {

而(n - 0) //'n变为零'

警报(n);

blastoff();

}

上面的代码实际上可以运行。循环直到n为0,这并不是ES6的新特性,但是和我们熟悉的特性结合在一起,就有很强的误导性。你能弄清楚上面的代码是如何工作的吗?可以在栈溢出上找到相应的答案。

当然还有另外一个箭头,就是小于等于运算符=。也许你还能找到使用箭头的地方,但让我们停下来看看一个我们从未见过的箭头:

!-单行注释

-goesto运算符

=小于或等于运算符

=?

那么,=是什么意思呢?这是本文将要讨论的话题。

首先说一下函数。

无处不在的函数表达式

JavaScript的一个有趣的特性是,无论何时你需要一个函数,你都可以很容易地创建它们。

例如,为按钮绑定一个单击事件:

$('#confetti-btn ')。点击(

$('#confetti-btn ')。点击(

JQuery的。click()方法需要一个函数作为参数,我们可以很容易地就地创建一个函数:

$('#confetti-btn ')。单击(功能(事件){

playTrumpet();

fireConfettiCannon();

});

$('#confetti-btn ')。单击(功能(事件){

playTrumpet();

fireConfettiCannon();

});

现在,我们编写这样的代码是最自然的事情。但是在JavaScript流行之前,这种风格的代码看起来还是很奇怪,因为其他语言没有这种特性。1958年,Lisp有一个函数表达式,也叫lambda函数,但是在C、Python、C#和Java中都没有,存在了很多年。

现在,四种语言都有lambda表达式,所有新语言都有内置的lambda表达式。现在JavaScript也支持这个特性,这要感谢那些严重依赖lambda表达式的库的开发者,这促进了它的广泛采用。

与其他几种语言相比,JavaScript的语法有点冗长:

//一个非常简单的六种语言的函数。

函数(a) {返回一个0;} //JS

[](int a){ return a 0;} //C

((a)(A0));咬舌

lambda a:一个0 # Python

a=a 0 //C#

a - a 0 //Java

//一个非常简单的六种语言的函数。

函数(a) {返回一个0;} //JS

[](int a){ return a 0;} //C

((a)(A0));咬舌

lambda a:一个0 # Python

a=a 0 //C#

a - a 0 //Java

箭头函数

ES6引入了新的语法来编写函数:

//ES5

var selected=all jobs . filter(function(job){

返回job . is selected();

});

//ES6

var selected=all jobs . filter(job=job . is selected());

//ES5

var selected=all jobs . filter(function(job){

返回job . is selected();

});

//ES6

var selected=all jobs . filter(job=job . is selected());

当需要一个只有一个参数的函数时,arrow函数的语法可以简化为Identifier=Expression,直接省略function和return关键字,甚至连括号和末尾的分号都同时省略。

要编写一个有多个(或者没有参数,或者Rest参数和默认参数,或者解构参数)参数的函数,需要将参数括在括号中:

//ES5

var total=values.reduce(函数(a,b) {

返回a b;

}, 0);

//ES6

var total=values.reduce((a,b)=a b,0);

//ES5

var total=values.reduce(函数(a,b) {

返回a b;

}, 0);

//ES6

var total=values.reduce((a,b)=a b,0);

箭头函数也可以和一些工具函数库完美配合使用,比如Underscore.js和Immutable。事实上,不可变文档中的所有示例都是用ES6编写的,其中很多已经使用了箭头函数。

除了使用表达式,函数体还可以包含语句块。回想一下我们之前提到的例子:

//ES5

$('#confetti-btn ')。单击(功能(事件){

playTrumpet();

fireConfettiCannon();

});

//ES5

$('#confetti-btn ')。单击(功能(事件){

playTrumpet();

fireConfettiCannon();

});

以下是箭头功能:

//ES6

$('#confetti-btn ')。点击(事件={

playTrumpet();

fireConfettiCannon();

});

//ES6

$('#confetti-btn ')。点击(事件={

playTrumpet();

fireConfettiCannon();

});

请注意,使用语句块的arrow函数不会自动返回值,必须显式使用return返回值。

另一条建议,当使用arrow函数返回一个对象时,一定要用括号将返回的对象括起来:

//为每只小狗创建一个新的空对象来玩

var chew toys=puppies . map(puppy={ });//BUG!

var chew toys=puppies . map(puppy=({ }));//好的

//为每只小狗创建一个新的空对象来玩

var chew toys=puppies . map(puppy={ });//BUG!

var chew toys=puppies . map(puppy=({ }));//好的

因为空对象{0}看起来和空语句块{0}一模一样,所以ES6会一直把{紧跟其后的=当做语句块的开头,而不是一个对象的开头,那么puppy={} 0}就会被解析为一个没有函数体的箭头函数,返回值是未定义的。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: