聊一聊JavaScript和Java、C#的“箭头函数”(一)

简介: ES6 中引入了箭头函数,这也是现在前端面试几乎必考的内容(没考箭头函数,我都不好意思说自己是面试官,哈哈,开个玩笑)。有人问我,箭头函数是个什么东西?我跟他说,就像Java和C#中的lambda。

1. 举个简单的栗子:

1.1 JavaScript:

let func = (s)=> { console.log(s); };
func("hello world");

1.2 Java:

interface Operate {
    void doSomething(String str);
    // void doSomething1(); 不可以有两个方法
}
public static void main(String[] args) {
    Operate func = (String s)->{ System.out.println(s);};
    func.doSomething("hello world");
}

1.3 C#:

var func = (string s)=> { Console.WriteLine(s); };
func("hello world");

1.4 分析

可以看到,写法非常类似,尤其是Js和C#。 变量func可以被当做一个函数来使用。


那么用于承接这个匿名方法的变量实际是什么?


JavaScript: 就是一个js中的function


Java: 在例子中,有点容易迷惑,明明是将lambda赋值给了一个接口类型。但最终调用的时候又要调用该接口的doSomething方法。而且这个接口只能有一个对应的方法,多了会报错。


Java10中也提供了var关键字,但遗憾的是也不能被用于这样lambda赋值的情况。


C#: 实际上是一个委托类型,例如:

delegate void doSomething(string str);
public static void Main(string[] args) {
    doSomething func = (string s) => { Console.WriteLine(s); };
    func("hello world");
}

这样看和Java有点像了,但定义的仍然是一个方法,而不是一个接口中有一个同样类型的方法。

  • 如果在c语言中我们会用一个指向函数的指针。

2. 对函数外变量的引用

在上一节的例子中,“hello world”是以参数的形式传递到方法中的,那么,是否可以直接引用外部的方法呢?

当然是可以的,改造一下上面的例子:

2.1 JavaScript:

let str = ",圣诞快乐。";
let func = (s)=> { 
    console.log(s + str); 
    str = ",春节快乐。"
};
str = ",元旦快乐。"
func("hello world");
func("hello world");

2.2 Java:

    interface Operate {
        void doSomething(String str);
        // void doSomething1(); 不可以有两个方法
    }
    public static void main(String[] args) {
        final String str = ",圣诞快乐";
        Operate func = (String s)->{
            System.out.println(s + str);
            //str = ",春节快乐。";
        };
        //str = ",元旦快乐。"
        func.doSomething("hello world");
    }

2.3 C#:

var str = ",圣诞快乐。";
var func = (string s) => { 
    Console.WriteLine(s + str );
    str = ",春节快乐。";
};
str = ",元旦快乐。";
func("hello world");
func("hello world");

2.4 分析

  • JavaScript 和C# 的结果是一样的,输出结果为:
hello world,元旦快乐。 
hello world,春节快乐。
  • 可见,在函数执行的时候,会取当时str的值。在函数定义的时候,虽然引用了变量str,但不是此时固定了str的值。
    在函数中改变了str的值,会改变外部str的值。
  • Java的例子中,要求str是final的才行,所以是无法对str改变的。
目录
相关文章
|
9天前
|
JavaScript
js 延时执行代码的最佳实践 —— 自定义 sleep 函数
js 延时执行代码的最佳实践 —— 自定义 sleep 函数
12 0
|
11天前
|
JavaScript
js 高频实用函数封装汇总(持续更新)
js 高频实用函数封装汇总(持续更新)
10 0
|
11天前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
9 0
|
11天前
|
JavaScript
js 调试 —— 断点(含进入函数、条件断点等)
js 调试 —— 断点(含进入函数、条件断点等)
14 0
|
11天前
|
JavaScript
JS【详解】函数.bind()
JS【详解】函数.bind()
5 0
|
11天前
|
JavaScript
js 【详解】函数中的 this 指向
js 【详解】函数中的 this 指向
12 0
|
12天前
|
存储 JavaScript 前端开发
|
2月前
|
JavaScript 前端开发 Java
Java和JavaScript的区别
【4月更文挑战第8天】Java和JavaScript的区别
25 1
|
2月前
|
前端开发 JavaScript Java
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
176 0
|
1月前
|
JavaScript 前端开发 Java
Java和JavaScript区别与联系
Java和JavaScript区别与联系
16 0