【JavaScript】ES6中的箭头函数是什么?

正如其名,箭头函数由 “箭头”(=>)这种新的语法来定义。

箭头函数的特点

  • 没有 this,rguments 绑定 -,this,argumentst 的值 由最近的不包含箭头函数的作用域决定。

  • 不能被 new 调用 - 箭头函数内部没有 [[Construct]] 方法,因此不能当作构造函数使用。使用 new 调用箭头函数会抛出错误。

  • 没有 prototype - 既然你不能使用 new 调用箭头函数,那么 prototype 就没有存在的理由。箭头函数没有 prototype 属性。

  • 不能更改 this - this 的值在函数内部不能被修改。在函数的整个生命周期内 this 的值是永恒不变的。

箭头函数的语法

  1. 一个空的箭头函数
var doNothing = () => {};

// 等同于:

var doNothing = function() {};

2 . 接收单个参数的箭头函数

var reflect = value => value;

// 等同于:

var reflect = function(value) {
    return value;
};
当箭头函数只有一个参数时,该参数可以直接使用而不需要额外的语法。之后则是箭头和需要计算的表达式,即使没有书写 return 语句也会返回该参数。

3 . 传入单个以上的参数,就需要用括号来包含它们

var sum = (num1, num2) => num1 + num2;

// 等同于:

var sum = function(num1, num2) {
    return num1 + num2;
};

4 . 当函数主体内包含一条以上表达式的时候,你需要用花括号显式地包裹函数

var sum = (num1, num2) => {
    expression1;
    expression2;
    expression3;
    return num1 + num2;
};

// 等同于:

var sum = function(num1, num2) {
    expression1;
    expression2;
    expression3;
    return num1 + num2;
};

5 .如果你想返回一个对象时:

var getTempItem = id => ({ id: id, name: "Temp" });

// 等同于:

var getTempItem = function(id) {

    return {
        id: id,
        name: "Temp"
    };
};

无this绑定

  • 在学习Js的过程中间,基本上每个人都吃过this的苦头,总是纠结this到底是什么?
  • 由于函数内部的 this 可以在调用时被上下文替换,所以操作了意想不到的对象的几率很大。考虑如下的例子:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Hello World</h1>
    <script>
        var PageHandler = {
            id: "123456",

            init: function () {
                document.addEventListener("click", function (event) {     
                    this.doSomething(event.type);     // error
                }, false);
            },

            doSomething: function (type) {
                console.log("Handling " + type + " for " + this.id);
            }
        };
        PageHandler.init();
    </script>
</body>
</html>
点击h1标签之后你会发现如下报错:
Uncaught TypeError: this.doSomething is not a function
出现问题是因为 this 指代的是调用该函数的对象(在本例中是 document)而不是PageHandler

你可以显式地在函数上调用 bind() 来绑定 this 以便解决这个问题,像这样:

var PageHandler = {

    id: "123456",

    init: function() {
        document.addEventListener("click", (function(event) {
            this.doSomething(event.type);     // 无错误发生
        }).bind(this), false);
    },

    doSomething: function(type) {
        console.log("Handling " + type  + " for " + this.id);
    }

虽然看起来有点奇怪,但是代码可以正常运行了。实际上我们创建了一个带有 this 绑定的新函数。为了避免额外函数的创建,更好的方式是使用箭头函数。

箭头函数没有 this 绑定,意味着this只能通过查找作用域链来确定。如果箭头函数被另一个不包含箭头函数的函数囊括,那么 this 的值和该函数中的 this 相等,否则 this 的值为 undefined。以下就是使用箭头函数重构的示例:

var PageHandler = {

    id: "123456",

    init: function() {
        document.addEventListener("click",
                event => this.doSomething(event.type), false); //这里的this就与箭头函数外面的init函数里面的this是一致的
    },

    doSomething: function(type) {
        console.log("Handling " + type  + " for " + this.id);
    }
};

猜你喜欢

转载自blog.csdn.net/AC_greener/article/details/80522804