js(=>) 箭头函数 详细解说 案例大全

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头:

x => x * x

上面的箭头函数相当于:

function (x) {
    return x * x;
}

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

x => {
    if (x > 0) {
        return x * x;
    }
    else {
        return - x * x;
    }
}

如果参数不是一个,就需要用括号()括起来:

// 两个参数:
(x, y) => x * x + y * y

// 无参数:
() => 3.14

// 可变参数:
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}
 

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

// SyntaxError:
x => { foo: x }
因为和函数体的{ ... }有语法冲突,所以要改为:

// ok:
x => ({ foo: x })

this

箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。

回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth; // this指向window或undefined
        };
        return fn();
    }
};

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
};
obj.getAge(); // 25

如果使用箭头函数,以前的那种hack写法:

var that = this;

就不再需要了。

由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth; // 1990
        var fn = (y) => y - this.birth; // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2015); // 25

 

Java流处理是Java中常用的一种数据处理方式,同时也是Java I/O的重要组成部分。Java中的流分为输入流和输出流,输入流用于从外部读取数据,输出流用于向外部写入数据。本篇回答将为你详细介绍Java流处理,并提供相关的案例解说。 Java流处理的基本概念: Java中的流是一组有序的字节数据,在Java中主要有两种流:输入流和输出流。输入流用于从外部读取数据,而输出流则用于向外部写入数据。在Java中,每种流都对应着一个类,这些类都是Java I/O库中的一部分。 Java中流的分类: Java中的流按照数据的类型可以分为字节流和字符流,按照数据流向可以分为输入流和输出流。 1. 字节流: 字节流是Java中处理字节数据的一种流,主要用于处理二进制数据和字符数据。字节流可以分为输入字节流和输出字节流,常用的类有InputStream和OutputStream。 2. 字符流: 字符流是Java中处理字符数据的一种流,主要用于处理文本数据。字符流可以分为输入字符流和输出字符流,常用的类有Reader和Writer。 Java中的流处理步骤: Java中的流处理通常可以分为以下三个步骤: 1. 打开流: 在Java中,要使用流进行数据处理,首先需要创建一个流对象。创建流对象时需要指定数据的来源和去处,也就是数据的输入和输出位置。例如,要从文件中读取数据,就需要创建一个文件输入流对象;要将数据写入到文件中,就需要创建一个文件输出流对象。 2. 读写数据: 创建好流对象之后,就可以通过该对象进行数据读写操作。Java提供了许多方法来进行数据读写操作,例如,InputStream类中的read()方法可以用于读取下一个字节数据;OutputStream类中的write()方法可以用于写入下一个字节数据。 3. 关闭流: 数据读写操作完成后,需要关闭流对象。关闭流对象可以释放系统资源,同时也可以确保数据写入到输出流中。在Java中,可以通过调用close()方法来关闭流对象。 Java流处理案例: 下面我们通过一个实例来演示Java流处理的具体过程。 1. 读取文件数据: 在以下的示例中,我们将演示如何使用Java流读取文件数据。我们将读取一个名为test.txt的文件,并将其内容输出到控制台上。 ``` import java.io.*; public class ReadFileDemo { public static void main(String[] args) { try { FileInputStream fis = new FileInputStream("test.txt"); int ch; while ((ch = fis.read()) != -1) { System.out.print((char) ch); } fis.close(); } catch (IOException e) { System.out.println("An error occurred."); e.printStackTrace(); } } } ``` 在以上示例中,我们使用了FileInputStream类来读取test.txt文件中的数据。程序首先会创建一个FileInputStream对象,然后通过该对象的read()方法来读取文件中的数据。最后,程序通过调用close()方法来关闭流对象。 2. 写入文件数据: 在以下示例中,我们将演示如何使用Java流将数据写入文件。我们将创建一个名为test.txt的文件,并向其中写入一些数据。 ``` import java.io.*; public class WriteFileDemo { public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("test.txt"); String data = "This is a test data."; byte[] byteArray = data.getBytes(); fos.write(byteArray); fos.close(); } catch (IOException e) { System.out.println("An error occurred."); e.printStackTrace(); } } } ``` 在以上示例中,我们使用了FileOutputStream类来向test.txt文件中写入数据。程序首先会创建一个FileOutputStream对象,然后通过该对象的write()方法来向文件中写入数据。最后,程序通过调用close()方法来关闭流对象。 总结: Java流处理是Java中常用的一种数据处理方式。Java中的流分为输入流和输出流,输入流用于从外部读取数据,输出流用于向外部写入数据。在Java中,每种流都对应着一个类,这些类都是Java I/O库中的一部分。Java中的流处理通常可以分为三个步骤:打开流、读写数据、关闭流。在使用流进行数据处理时,需要注意关闭流对象,以释放系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值