>  기사  >  웹 프론트엔드  >  JavaScript 화살표 기능에 대한 자세한 설명(그래픽 튜토리얼)

JavaScript 화살표 기능에 대한 자세한 설명(그래픽 튜토리얼)

亚连
亚连원래의
2018-05-19 10:47:512455검색

이 글에서는 초보자의 관점에서 Javascript ES6의 Arrow 함수에 대한 기본 지식을 자세히 설명합니다. ES6에서는 함수를 정의하기 위해 이 방법을 사용하지 마세요. 가독성을 보장하기 위해 이 기사는 직역이 아닌 무료 번역을 사용합니다. 또한, 이 글의 저작권은 원저자에게 있으며, 번역은 학습용으로만 사용됩니다.

이 글에서는 화살표 기능의 장점을 소개합니다.

더 간결한 구문

먼저 일반 구문에 따라 함수를 정의해 보겠습니다.

function funcName(params) {
  return params + 2;
 }
funcName(2);
// 4

이 함수는 화살표 함수를 사용하며 단 한 줄의 코드로 수행할 수 있습니다!

var funcName = (params) => params + 2
funcName(2);
// 4

멋지지 않나요! 매우 간결한 예이지만 코드 작성 시 화살표 함수의 장점을 잘 보여줍니다. 화살표 함수의 구문을 더 자세히 살펴보겠습니다.

(매개변수) => { 문 }


매개변수가 없으면 더 단순화할 수 있습니다. (parameters) => { statements }

如果没有参数,那么可以进一步简化:
() => { statements }

如果只有一个参数,可以省略括号:
parameters => { statements }

如果返回值仅仅只有一个表达式(expression), 还可以省略大括号:
parameters => expression

// 等价于:
function (parameters){
 return expression;
}

现在你已经学会了箭头函数的语法,我们来实战一下。打开Chrome浏览器开发者控制台,输入:
var double = num => num * 2

我们将变量 double 绑定到一个箭头函数,该函数有一个参数 num , 返回 num * 2 。 调用该函数:

double(2);
// 4

double(3);
// 6

没有局部 this 的绑定

和一般的函数不同,箭头函数不会绑定 this 。 或则说箭头函数不会改变 this 本来的绑定。

我们用一个例子来说明:

function Counter() {
 this.num = 0;
}
var a = new Counter();

因为使用了关键字 new 构造,Count()函数中的 this 绑定到一个新的对象,并且赋值给 a 。通过 console.log 打印

a.num ,会输出0。 
console.log(a.num);
// 0

如果我们想每过一秒将 a.num 的值加1,该如何实现呢?可以使用 setInterval() 函数。

function Counter() {
 this.num = 0;
 this.timer = setInterval(function add() {
  this.num++;
  console.log(this.num);
 }, 1000);
}

我们来看一下输出结果:

var b = new Counter();
// NaN
// NaN
// NaN
// ...

你会发现,每隔一秒都会有一个 NaN 打印出来,而不是累加的数字。到底哪里错了呢?

首先使用如下语句停止 setInterval 函数的连续执行:
clearInterval(b.timer);

我们来尝试理解为什么出错:根据上一篇博客讲解的规则,首先函数 setInterval 没有被某个声明的对象调用,也没有使用 new 关键字,再之没有使用 bind , call 和 apply 。 setInterval 只是一个普通的函数。实际上 setInterval 里面的 this 绑定到全局对象的。我们可以通过将 this 打印出来验证这一点:

function Counter() {
 this.num = 0;
this.timer = setInterval(function add() {
  console.log(this);
 }, 1000);
}
var b = new Counter();

你会发现,整个 window 对象被打印出来。 使用如下命令停止打印:
clearInterval(b.timer);

回到之前的函数,之所以打印 NaN ,是因为 this.num 绑定到 window 对象的 num ,而 window.num 未定义。

那么,我们如何解决这个问题呢?使用箭头函数!使用箭头函数就不会导致 this 被绑定到全局对象。

function Counter() {
 this.num = 0;
 this.timer = setInterval(() => {
  this.num++;
  console.log(this.num);
 }, 1000);
}
var b = new Counter();
// 1
// 2
// 3
// ...

通过 Counter 构造函数绑定的 this 将会被保留。在 setInterval 函数中, this 依然指向我们新创建的 b 对象。

为了验证刚刚的说法,我们可以将 Counter 函数中的 this 绑定到 that , 然后在 setInterval 中判断 this 和 that 是否相同。

function Counter() {
 var that = this;
 this.timer = setInterval(() => {
  console.log(this === that);
 }, 1000);
}
var b = new Counter();
// true
// true
// ...

正如我们期望的,打印值每次都是 true 。最后,结束刷屏的打印:
clearInterval(b.timer);() = > { 문 }

매개변수가 하나만 있는 경우 대괄호를 생략할 수 있습니다.

매개변수 => { 문 }

반환 값이 하나의 표현식( 표현식), 중괄호를 생략할 수도 있습니다:

매개변수 => 표현식rrreee이제 화살표 함수의 구문을 배웠으니 연습해 보겠습니다. Chrome 브라우저 개발자 콘솔을 열고 다음을 입력합니다. var double = num => num * 2
변수 double을 매개변수 num이 있는 화살표 함수에 바인딩하고 num*2를 반환합니다. . 이 함수를 호출하세요:

rrreee

No local this 바인딩일반 함수와 달리 화살표 함수는 this를 바인딩하지 않습니다. 즉, 화살표 기능은 이것의 원래 바인딩을 변경하지 않습니다.

설명하기 위해 예를 사용합니다.

rrreee 키워드 new가 구성에 사용되기 때문에 Count() 함수의 this는 새 개체에 바인딩되고 a에 할당됩니다. console.log를 통해 인쇄rrreee a.num의 값을 1초마다 1씩 늘리려면 어떻게 해야 하나요? setInterval() 함수를 사용할 수 있습니다. rrreee
출력을 살펴보겠습니다.

rrreee🎜 매초마다 누적된 숫자 대신 NaN이 인쇄되는 것을 확인할 수 있습니다. 무엇이 잘못되었나요? 🎜🎜먼저 다음 명령문을 사용하여 setInterval 함수의 연속 실행을 중지합니다. 🎜clearInterval(b.timer);🎜🎜오류가 발생한 이유를 이해해 보겠습니다. 이전 블로그에서 먼저 setInterval 함수는 선언된 객체에 의해 호출될 때 new 키워드를 사용하지 않고, 바인딩, 호출, 적용을 사용하지 않습니다. setInterval은 일반적인 함수입니다. 실제로 setInterval의 이는 전역 개체에 바인딩됩니다. 다음을 인쇄하여 이를 확인할 수 있습니다. 🎜rrreee🎜 전체 창 개체가 인쇄된 것을 확인할 수 있습니다. 인쇄를 중지하려면 다음 명령을 사용하세요. 🎜clearInterval(b.timer);🎜🎜이전 함수로 돌아갑니다. NaN이 인쇄되는 이유는 this.num이 window 개체 및 window.num이 정의되지 않았습니다. 🎜🎜그렇다면 이 문제를 어떻게 해결할까요? 화살표 기능을 사용해보세요! 화살표 기능을 사용해도 이것이 전역 개체에 바인딩되지 않습니다. 🎜rrreee🎜Counter 생성자를 통한 이 바인딩은 유지됩니다. setInterval 함수에서 이는 여전히 새로 생성된 b 객체를 가리킵니다. 🎜🎜방금 말한 내용을 확인하기 위해 Counter 함수의 this를 that에 바인딩한 다음 setInterval에서 이것과 that이 동일한지 확인할 수 있습니다. 🎜rrreee🎜예상대로 인쇄된 값은 매번 정확합니다. 마지막으로 화면 스와이프 인쇄를 종료합니다. 🎜clearInterval(b.timer);🎜🎜위 내용은 제가 모든 사람을 위해 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다. 🎜🎜관련 기사: 🎜🎜🎜Vue.🎜js🎜계산 및 리스너 속성 사용에 대한 자세한 설명🎜🎜🎜🎜🎜JS 파일을 동적으로 로드하는 세 가지 방법 요약🎜🎜🎜🎜🎜🎜js🎜교차 도메인 방법 요약 게시물 요청 지원 🎜🎜🎜

위 내용은 JavaScript 화살표 기능에 대한 자세한 설명(그래픽 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.