前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Js箭头函数

Js箭头函数

作者头像
WindrunnerMax
发布2020-08-27 10:33:08
4.9K0
发布2020-08-27 10:33:08
举报
文章被收录于专栏:Czy‘s BlogCzy‘s Blog

Js箭头函数

箭头函数是ES6新增的语法,提供了一种更加简洁的函数书写方式,类似于匿名函数,并且简化了函数定义。

完整写法

完整写法类似于匿名函数,省略了function关键字。

代码语言:javascript
复制
var s = (a,b) => {
    console.log(a, b); // 1 2
    return a + b;
}
s(1,2);
代码语言:javascript
复制
// 相当于
var s = function(a,b) {
    console.log(a, b); // 1 2
    return a + b;
}
s(1,2);

省略小括号

当参数只有1个时,可以省略小括号,当没有参数或者两个以上的参时不能省略小括号。

代码语言:javascript
复制
var s = a => {
    console.log(a); // 1
    return a + a;
}
s(1);
代码语言:javascript
复制
// 相当于
var s = function(a) {
    console.log(a); // 1
    return a + a;
}
s(1);

省略大括号

当函数体只有一行语句时,可以省略{},并且会自动return这条语句的返回值。

代码语言:javascript
复制
var cmp = (a, b) => a - b;
var a = [5, 4, 3, 2, 1];
var sortedArr = a.sort(cmp);
console.log(sortedArr); // [1, 2, 3, 4, 5]
代码语言:javascript
复制
// 相当于
var cmp = function(a, b) { return a - b; };
var a = [5, 4, 3, 2, 1];
var sortedArr = a.sort(cmp);
console.log(sortedArr); // [1, 2, 3, 4, 5]

省略小括号与大括号

当满足上述两个条件时,小括号与大括号可以全部省略。

代码语言:javascript
复制
var s = a => a * 2;
console.log(s(1)); // 2
代码语言:javascript
复制
// 相当于
var s = function(a) { return a * 2; }
console.log(s(1)); // 2

返回对象字面量

省略写法返回对象时注意需要使用()将对象包裹,否则浏览器会把对象的{}解析为箭头函数函数体的开始和结束标记。

代码语言:javascript
复制
var s = a => ({"a": a * 2});
console.log(s(1)); // {a: 2}
代码语言:javascript
复制
// 相当于
var s = function(a) { return {"a": a * 2}; }
console.log(s(1)); // {a: 2}

没有单独的this

箭头函数没有单独的this,在箭头函数的函数体中使用this时,会取得其上下文context环境中的this。箭头函数调用时并不会生成自身作用域下的this,它只会从自己的作用域链的上一层继承this。由于箭头函数没有自己的this指针,使用applycallbind仅能传递参数而不能动态改变箭头函数的this指向。

代码语言:javascript
复制
var obj = {
    s1: () => {
        console.log(this);
    },
    s2: function(){
        console.log(this);
    }
}

obj.s1(); // Window ...
obj.s2(); // {s1: ƒ, s2: ƒ}

/*
 在调用时运行的环境是Window,而s1为箭头函数不改变this指向,所以指向Window
 s2为普通函数,可以改变this指向,所以this指向了调用者
*/
代码语言:javascript
复制
var contextObj = {
    e: function() {
        var obj = {
            s1: () => {
                console.log(this);
            },
            s2: function(){
                console.log(this);
            }
        }
        
        obj.s1(); // {e: ƒ}
        obj.s2(); // {s1: ƒ, s2: ƒ}
    }
}
contextObj.e();
/*
 在调用时运行的环境是contextObj对象,而s1为箭头函数不改变this指向,所以指向contextObj对象
 s2为普通函数,可以改变this指向,所以this指向了调用者
*/

利用箭头函数的this指向特点可以解决一些问题,例如常见的回调函数中this指向问题。

代码语言:javascript
复制
// 常见的回调函数this指向问题
var a = 1;
var obj = {
    a: 2,
    run: function(){
        var callback = function(){
            console.log(this.a);
        }
        setTimeout(callback,1000); // 1 // 回调函数this调用时指向了Window
    }
}
obj.run();

对于这个问题可以将this值分配给封闭的变量来解决。

代码语言:javascript
复制
var a = 1;
var obj = {
    a: 2,
    run: function(){
        var that = this;
        var callback = function(){
            console.log(that.a);
        }
        setTimeout(callback,1000); // 2
    }
}
obj.run();

也可以使用bind来事先将函数执行时的this绑定。

代码语言:javascript
复制
var a = 1;
var obj = {
    a: 2,
    run: function(){
        var callback = function(){
            console.log(this.a);
        }
        setTimeout(callback.bind(this),1000); // 2
    }
}
obj.run();

使用箭头函数可以直接编写回调函数而不改变this指向,箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this

代码语言:javascript
复制
var a = 1;
var obj = {
    a: 2,
    run: function(){
        var callback = () => {
            console.log(this.a);
        }
        setTimeout(callback,1000); // 2
    }
}
obj.run();

不绑定arguments

箭头函数不绑定arguments,在箭头函数函数体内取得arguments只是引用了封闭作用域内的arguments,不会生成自身作用域下的thisarguments值。

代码语言:javascript
复制
function s(a,b){
    console.log(...arguments); // 1 2
    var ss1 = (c) => {
        console.log(...arguments); // 1 2
    }
    var ss2 = function(c){
        console.log(...arguments); // 3
    }
    ss1(3);
    ss2(3);
}
s(1, 2);

不能用作构造器

箭头函数不能用作构造器,使用new实例化时会抛出异常。

代码语言:javascript
复制
var s = () => {};
new s(); // Uncaught TypeError: s is not a constructor

没有原型属性

箭头函数没有prototype属性。

代码语言:javascript
复制
var s = () => {};
console.log(s.prototype); // undefined

不能用作函数生成器

箭头函数不能用作Generatoryield关键字通常不能在箭头函数中使用,除非是嵌套在允许使用的函数内。

每日一题

代码语言:javascript
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:javascript
复制
https://segmentfault.com/a/1190000010159725
https://www.runoob.com/w3cnote/es6-function.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Js箭头函数
    • 完整写法
      • 省略小括号
        • 省略大括号
          • 省略小括号与大括号
            • 返回对象字面量
              • 没有单独的this
                • 不绑定arguments
                  • 不能用作构造器
                    • 没有原型属性
                      • 不能用作函数生成器
                        • 每日一题
                          • 参考
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档