箭头函数_html下一页

箭头函数_html下一页箭头函数没有自己的this,arguments,super或new.target。箭头函数适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。 1.基础语法 1 (param1, param2, …, paramN) => { statements } 1 (param1, para

箭头函数_html下一页"

箭头函数没有自己的this,arguments,super或new.target。箭头函数适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

1.基础语法

1 (param1, param2, ..., paramN) => { statements }
1 (param1, param2, ..., paramN) => expression
2 //相当于: (param1, param2, ..., paramN) => {return expression}
3 //当函数体内只有一句代码时,retrun 和 {}可以省略
4 
5 //当只有一个参数时,圆括号也是可选的, 可省略
6 (singleParam) => {statements}
7   singleParam => {statements}
8 //没有参数的函数应该写成一对圆括号
9 () => {statements}
  //空的箭头函数返回undefined
10 let empty = () => {};

1.1.返回对象时要加括号

1 params => ({foo: bar}) //返回对象字面量表达式

1.2.支持剩余参数和默认参数

1 (param1, param2, ...rest) => {statements}
2 (param1=defaultValue1, param2, ..., paramN=defaultValueN) => {statements}

1.3.支持参数列表解构

1 let f = ([a, b] = [1, 2], {x: c} = {x : a + b}) => a + b + c;
2 f(); //6

2.箭头函数不绑定this

普通函数是根据它是如何被调用的来定义这个函数的this值

  • 如果该函数是一个构造函数,this指向一个新的对象(实例对象)
  • 在严格模式下的函数调用,this指向undefined
  • 如果该函数是一个对象的方法,则它指向这个对象

2.1箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。

1 function Person() {
2     this.age = 0;
3 
4     setInterval(() => {
5         this.age++;  // this 指向p 实例
6     }, 1000);
7 }
8 
9 var p = new Person();

2.2通过 call 或 apply 调用时

由于箭头函数没有自己的 this,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this),它们的第一个参数会被忽略。(这种现象对bind方法也成立)

 

 1 var adder = {
 2     base: 1,
 3     
 4     add: function(a) {
 5         var f = v => v + this.base;
 6         return f(a);
 7     },
 8     
 9     addThruCall: function(a) {
10         var f = v => v + this.base;
11         var b = {
12             base: 2
13         };
14          return f.call(b, a);
15     }
16 };
17 
18 console.log(adder.add(1));  //2
19 console.log(adder.addThruCall(1))  // 2

3.不绑定arguments

箭头函数不绑定Arguments对象。不可以使用arguments对象,该对象在函数体内不存在。

1 function foo(n) {
2    var f = () => arguments[0] + n; //隐式绑定 foo 函数的 arguments 对象。arguments[0] 是 n, 即传给foo函数的第一个参数
3    return f();
4 }
5 
6 foo(1); //2
7 foo(2); //4
8 foo(3); //6
9 foo(3,2); //6

 在大多数情况下,使用剩余参数是相较使用arguments对象的更好选择。

 1 function foo(arg) {
 2     var f = (..args) => args[0];
 3     return f(arg);
 4 }
 5 
 6 foo(1);  //1
 7 
 8 function foo(arg1, arg2) {
 9     var f = (...args) => args[1];
10     return f(arg1, arg2);
11 }
12 
13 foo(1, 2);  //2

4.箭头函数不能用作构造函数,和new一起使用会抛出错误。

5.箭头函数没有prototype属性

6.箭头函数不能用作函数生成器,因为yield关键字通常不能再箭头函数中使用(除非是嵌套在允许使用的函数内)。

7.箭头函数不适合用作对象的方法

 1 'use strict';
 2 var obj = {
 3     i: 10,
 4     b: () => console.log(this.i, this),
 5     c: function() {
 6         console.log(this.i, this);
 7     }
 8 }
 9 
10 obj.b(); //undefined, window{...}
11 obj.c(); //10, Object{...}
12 
13 
14 var obj = {
15     a: 10
16 };
17 
18 Object.defineProperty(obj, "b", {
19     get: () => {
20         console.log(this.a, typeof this.a, this);
21         return this.a + 10;
22         //this 代表全局对象 'window', 因此,'this.a' 返回 'undefined'
23     }
24 });
25 obj.b;  //undefined "undefined" Window{postMessage: f, blur: f, focus: ƒ, close: ƒ, frames: Window, …}

8.箭头函数的解析顺序

箭头函数具有与常规函数不同的特殊运算符优先级解析规则

1 let callback;
2 
3 callback = callback || function() {};  //ok
4 
5 callback = callback || () => {}; //SyntaxError: invalid arrow-function arguments
6 
7 callback = callback || (() => {});  //ok

9.箭头函数使用三元运算符:

1 var simple = a => a > 15 ? 15 : a;
2 
3 simple(16); //15
4 simple(10); //10
5 
6 
7 let max = (a, b) => a > b ? a : b;

10.箭头函数内定义的变量及作用域

 1 //常规写法
 2 var greeting = () => {let now = new Date(); return ("Good" + ((now.getHours() > 17) ? "evening." : "day."));}
 3 greeting();          //"Good day."
 4 console.log(now);    // ReferenceError: now is not defined 标准的let作用域
 5 
 6 //参数括号内定义的变量是局部变量(默认参数)
 7 var greeting = (now=new Date()) = > "Good" + (now.getHours() > 17 ? "evening." : "day.);
 8 greeting();          //"Good day."
 9 console.log(now);    // ReferenceError: now is not defined
10 
11 //对比: 函数体内{}不使用var定义的变量是全局变量
12 var greeting = () => {now = new Date(); return ("Good" + ((now.getHours() > 17) ? " evening." : " day."));}
13 greeting();           //"Good day."
14 console.log(now);     // Fri Dec 22 2017 10:01:00 GMT+0800 (中国标准时间)
15 
16 //对比: 函数体内{} 用var定义的变量是局部变量
17 var greeting = () => {var now = new Date(); return ("Good" + ((now.getHours() > 17) ? " evening." : " day."));}
18 greeting(); //"Good day."
19 console.log(now);    // ReferenceError: now is not defined

11.箭头函数可以使用闭包

 1 //标准的闭包函数
 2 function A() {
 3     var i = 0;
 4     return function b() {
 5         return (++i);
 6     };
 7 }
 8 
 9 var v =A();
10 v();  //1
11 v(); //2
12 
13 //箭头函数的闭包(i=0 是默认参数)
14 var Add = (i=0) => {return (() => (++i))};
15 var v = Add();
16 v(); //1
17 v(); //2

12.箭头函数递归

1 var fact = (x) => (x == 0 ? 1 : x*fact(x-1));
2 
3 fact(5);  //120

 

今天的文章箭头函数_html下一页分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/48904.html

(0)
编程小号编程小号
上一篇 2023-09-03 17:06
下一篇 2023-09-03 17:17

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注