차이점: 1. 화살표 함수의 정의는 일반 함수의 정의보다 훨씬 간단하고 명확하며 빠릅니다. 2. 화살표 함수는 자체 this를 생성하지 않지만 일반 함수는 생성할 수 없습니다. 생성자로 사용됨 화살표 함수는 생성자로 사용할 수 있습니다. 4. 화살표 함수에는 자체 인수가 없지만 화살표 함수에는 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.
Arrow 함수는 프론트엔드 인터뷰에서 자주 사용되는 테스트 포인트입니다. Arrow 함수는 일반 함수보다 구문이 단순하기 때문에 많은 사람들이 알고 있다고 생각합니다.
1. 기본 구문
ES6에서는 화살표 =>
를 사용하여 화살표 함수를 정의할 수 있습니다. 간단한 예를 살펴보겠습니다. =>
来定义箭头函数,具体语法,我们来看一个简单的例子:
// 箭头函数 let fun = (name) => { // 函数体 return `Hello ${name} !`; }; // 等同于 let fun = function (name) { // 函数体 return `Hello ${name} !`; };
可以看出,定义箭头函在数语法上要比普通函数简洁得多。箭头函数省去了function
关键字,采用箭头=>
来定义函数。函数的参数放在=>
前面的括号中,函数体跟在=>
后的花括号中。
关于箭头函数的参数:
① 如果箭头函数没有参数,直接写一个空括号即可。
② 如果箭头函数的参数只有一个,也可以省去包裹参数的括号。
③ 如果箭头函数有多个参数,将参数依次用逗号(,)分隔,包裹在括号中即可。
// 没有参数 let fun1 = () => { console.log(111); }; // 只有一个参数,可以省去参数括号 let fun2 = name => { console.log(`Hello ${name} !`) }; // 有多个参数 let fun3 = (val1, val2, val3) => { return [val1, val2, val3]; };
关于箭头函数的函数体:
① 如果箭头函数的函数体只有一句代码,就是简单返回某个变量或者返回一个简单的JS表达式,可以省去函数体的大括号{ }。
let f = val => val; // 等同于 let f = function (val) { return val }; let sum = (num1, num2) => num1 + num2; // 等同于 let sum = function(num1, num2) { return num1 + num2; };
② 如果箭头函数的函数体只有一句代码,就是返回一个对象,可以像下面这样写:
// 用小括号包裹要返回的对象,不报错 let getTempItem = id => ({ id: id, name: "Temp" }); // 但绝不能这样写,会报错。 // 因为对象的大括号会被解释为函数体的大括号 let getTempItem = id => { id: id, name: "Temp" };
③ 如果箭头函数的函数体只有一条语句并且不需要返回值(最常见是调用一个函数),可以给这条语句前面加一个void
关键字
let fn = () => void doesNotReturn();
箭头函数最常见的用处就是简化回调函数。
// 例子一 // 正常函数写法 [1,2,3].map(function (x) { return x * x; }); // 箭头函数写法 [1,2,3].map(x => x * x); // 例子二 // 正常函数写法 var result = [2, 5, 1, 4, 3].sort(function (a, b) { return a - b; }); // 箭头函数写法 var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);
二、箭头函数与普通函数的区别
1、语法更加简洁、清晰
从上面的基本语法示例中可以看出,箭头函数的定义要比普通函数定义简洁、清晰得多,很快捷。
2、箭头函数不会创建自己的this(重要!!深入理解!!)
我们先来看看MDN上对箭头函数this
的解释。
箭头函数不会创建自己的
this
,所以它没有自己的this
,它只会从自己的作用域链的上一层继承this
。
箭头函数没有自己的this
,它会捕获自己在定义时(注意,是定义时,不是调用时)所处的外层执行环境的this
,并继承这个this
值。所以,箭头函数中this
的指向在它被定义的时候就已经确定了,之后永远不会改变。
来看个例子:
var id = 'Global'; function fun1() { // setTimeout中使用普通函数 setTimeout(function(){ console.log(this.id); }, 2000); } function fun2() { // setTimeout中使用箭头函数 setTimeout(() => { console.log(this.id); }, 2000) } fun1.call({id: 'Obj'}); // 'Global' fun2.call({id: 'Obj'}); // 'Obj'
上面这个例子,函数fun1
中的setTimeout
中使用普通函数,2秒后函数执行时,这时函数其实是在全局作用域执行的,所以this
指向Window
对象,this.id
就指向全局变量id
,所以输出'Global'
var id = 'GLOBAL'; var obj = { id: 'OBJ', a: function(){ console.log(this.id); }, b: () => { console.log(this.id); } }; obj.a(); // 'OBJ' obj.b(); // 'GLOBAL'
fun2
中的setTimeout
中使用的是箭头函数,这个箭头函数的this
在定义时就确定了,它继承了它外层fun2
的执行环境中的this
,而fun2
调用时this
被call
方法改变到了对象{id: 'Obj'}
中,所以输出'Obj'
。
再来看另一个例子:
var id = 'Global'; // 箭头函数定义在全局作用域 let fun1 = () => { console.log(this.id) }; fun1(); // 'Global' // this的指向不会改变,永远指向Window对象 fun1.call({id: 'Obj'}); // 'Global' fun1.apply({id: 'Obj'}); // 'Global' fun1.bind({id: 'Obj'})(); // 'Global'
上面这个例子,对象obj
的方法a
使用普通函数定义的,普通函数作为对象的方法调用时,this
指向它所属的对象。所以,this.id
就是obj.id
,所以输出'OBJ'
As you 보시다시피 화살표 함수를 정의하는 것은 일반 함수보다 수학적 구문에서 훨씬 간단합니다. 화살표 함수는 function
키워드를 생략하고 화살표 =>
를 사용하여 함수를 정의합니다. 함수의 매개변수는 =>
앞의 괄호 안에 배치되고, 함수 본문은 =>
뒤의 중괄호 안에 배치됩니다. b
是使用箭头函数定义的,箭头函数中的this
实际是继承的它定义时所处的全局执行环境中的this
,所以指向Window
对象,所以输出'GLOBAL'
。(这里要注意,定义对象的大括号{}
let Fun = (name, age) => { this.name = name; this.age = age; }; // 报错 let p = new Fun('cao', 24);🎜🎜화살표 함수의 함수 본문에 대하여: 🎜🎜🎜🎜①🎜 화살표 함수의 함수 본문에 단순히 변수나 간단한 JS 표현식을 반환하는 한 줄의 코드만 있는 경우 곱슬머리를 생략할 수 있습니다. 함수 본문의 중괄호. 🎜
// 例子一 let fun = (val) => { console.log(val); // 111 // 下面一行会报错 // Uncaught ReferenceError: arguments is not defined // 因为外层全局环境没有arguments对象 console.log(arguments); }; fun(111); // 例子二 function outer(val1, val2) { let argOut = arguments; console.log(argOut); // ① let fun = () => { let argIn = arguments; console.log(argIn); // ② console.log(argOut === argIn); // ③ }; fun(); } outer(111, 222);🎜🎜②🎜 화살표 함수의 함수 본문에 객체를 반환하는 명령문이 하나만 있는 경우 다음과 같이 작성할 수 있습니다. 명령문이며 값을 반환할 필요가 없습니다(가장 일반적인 것은 함수를 호출하는 것입니다). 이 명령문 앞에
void
키워드를 추가할 수 있습니다🎜let sayHi = () => { console.log('Hello World !') }; console.log(sayHi.prototype); // undefined🎜화살표 함수의 가장 일반적인 용도는 다음과 같습니다. 콜백 함수를 단순화합니다. 🎜rrreee🎜🎜🎜 2. 화살표 함수와 일반 함수의 차이점 🎜🎜🎜🎜🎜 1. 구문이 더 간결하고 명확해졌습니다. 🎜🎜🎜 위의 기본 구문 예에서 볼 수 있듯이 화살표 함수의 정의가 더 간단합니다. 일반 함수의 정의보다 훨씬 명확하고 빠릅니다. 🎜🎜🎜2. 화살표 함수는 자체 this를 생성하지 않습니다. (중요!! 심층 이해!!) 🎜🎜🎜 먼저 MDN에서 화살표 함수
this
에 대한 설명을 살펴보겠습니다. . 🎜🎜🎜화살표 함수는 자체 this
를 생성하지 않으므로 자체 this
가 없으며 자체 상위 수준의 만 상속합니다. 범위 체인은 이
입니다. 🎜🎜🎜화살표 함수에는 자체 this
가 없으며 🎜definition🎜할 때 🎜외부 실행 환경의 this를 캡처합니다(참고로 정의된 경우에는 호출될 때)
🎜, 이 이
값을 상속받습니다. 따라서 화살표 함수에서 this
를 가리키는 것은 정의될 때 결정되며 나중에 변경되지 않습니다. 🎜🎜예제를 살펴보겠습니다. 🎜rrreee🎜위 예에서는 2 이후 함수가 실행될 때 fun1
함수의 setTimeout
에서 일반 함수를 사용합니다. 초, 함수는 실제로 전역 범위에서 실행되므로 this
는 Window
개체를 가리키고 this.id
는 전역 변수 id
이므로 'Global'
을 출력합니다.
하지만 화살표 함수는 fun2
함수의 setTimeout
에서 사용됩니다. 이 화살표 함수의 this
는 정의될 때 결정되며 이를 상속받습니다. . 외부 fun2
의 실행 환경에서는 this
이고, fun2
가 호출되면 this
는 입니다. 호출됨 code> 메소드가 <code>{id: 'Obj'}
객체로 변경되어 'Obj'
가 출력됩니다. 🎜🎜다른 예를 살펴보겠습니다. 🎜rrreee🎜위 예에서 obj
개체의 a
메서드는 일반 함수를 사용하여 정의됩니다. 개체의 메서드로 호출되는 this
는 해당 개체가 속한 개체를 가리킵니다 🎜. 따라서 this.id
는 obj.id
이므로 'OBJ'
가 출력됩니다.
그러나 b
메서드는 화살표 함수를 사용하여 정의됩니다. 화살표 함수의 this
는 실제로 정의된 전역 실행 환경에서 this
를 상속합니다. >이므로 Window
개체를 가리키므로 'GLOBAL'
이 출력됩니다. (🎜객체를 정의하는 중괄호 {}
는 별도의 실행 환경을 구성할 수 없으며 여전히 전역 실행 환경에 있다는 점에 유의해야 합니다!!🎜)🎜3、箭头函数继承而来的this指向永远不变(重要!!深入理解!!)
上面的例子,就完全可以说明箭头函数继承而来的this
指向永远不变。对象obj
的方法b
是使用箭头函数定义的,这个函数中的this
就永远指向它定义时所处的全局执行环境中的this
,即便这个函数是作为对象obj
的方法调用,this
依旧指向Window
对象。
4、.call()/.apply()/.bind()无法改变箭头函数中this的指向
.call()
/.apply()
/.bind()
方法可以用来动态修改函数执行时this
的指向,但由于箭头函数的this
定义时就已经确定且永远不会改变。所以使用这些方法永远也改变不了箭头函数this
的指向,虽然这么做代码不会报错。
var id = 'Global'; // 箭头函数定义在全局作用域 let fun1 = () => { console.log(this.id) }; fun1(); // 'Global' // this的指向不会改变,永远指向Window对象 fun1.call({id: 'Obj'}); // 'Global' fun1.apply({id: 'Obj'}); // 'Global' fun1.bind({id: 'Obj'})(); // 'Global'
5、箭头函数不能作为构造函数使用
我们先了解一下构造函数的new都做了些什么?简单来说,分为四步: ① JS内部首先会先生成一个对象; ② 再把函数中的this指向该对象; ③ 然后执行构造函数中的语句; ④ 最终返回该对象实例。
但是!!因为箭头函数没有自己的this
,它的this
其实是继承了外层执行环境中的this
,且this
指向永远不会随在哪里调用、被谁调用而改变,所以箭头函数不能作为构造函数使用,或者说构造函数不能定义成箭头函数,否则用new
调用时会报错!
let Fun = (name, age) => { this.name = name; this.age = age; }; // 报错 let p = new Fun('cao', 24);
6、箭头函数没有自己的arguments
箭头函数没有自己的arguments
对象。在箭头函数中访问arguments
实际上获得的是外层局部(函数)执行环境中的值。
// 例子一 let fun = (val) => { console.log(val); // 111 // 下面一行会报错 // Uncaught ReferenceError: arguments is not defined // 因为外层全局环境没有arguments对象 console.log(arguments); }; fun(111); // 例子二 function outer(val1, val2) { let argOut = arguments; console.log(argOut); // ① let fun = () => { let argIn = arguments; console.log(argIn); // ② console.log(argOut === argIn); // ③ }; fun(); } outer(111, 222);
上面例子二,①②③处的输出结果如下:
很明显,普通函数outer
内部的箭头函数fun
中的arguments
对象,其实是沿作用域链向上访问的外层outer
函数的arguments
对象。
可以在箭头函数中使用rest参数代替arguments对象,来访问箭头函数的参数列表!!
7、箭头函数没有原型prototype
let sayHi = () => { console.log('Hello World !') }; console.log(sayHi.prototype); // undefined
8、箭头函数不能用作Generator函数,不能使用yeild关键字
【相关推荐:javascript视频教程、web前端】
위 내용은 es6의 화살표 기능과 일반 기능의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!