聊一聊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改变的。
目录
相关文章
|
3天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
18 5
|
1天前
|
JavaScript 前端开发
JavaScript作用域关乎变量和函数的可见范围。
【6月更文挑战第27天】JavaScript作用域关乎变量和函数的可见范围。全局作用域适用于整个脚本,局部作用域限于函数内部,而ES6引入的`let`和`const`实现了块级作用域。全局变量易引发冲突和内存占用,局部作用域在函数执行后消失,块级作用域提高了变量管理的灵活性。作用域关键在于组织代码和管理变量生命周期。
13 1
|
1天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
|
2天前
|
算法 安全 Java
Java数据结构与算法:哈希函数
Java数据结构与算法:哈希函数
|
2天前
|
Java 索引
Java中indexOf函数详解
Java中indexOf函数详解
|
3天前
|
自然语言处理 前端开发 JavaScript
JavaScript 函数指南:掌握编程密钥库的精髓
JavaScript 函数指南:掌握编程密钥库的精髓
|
3天前
|
前端开发 JavaScript 安全
解锁 JavaScript ES6:函数与对象的高级扩展功能
解锁 JavaScript ES6:函数与对象的高级扩展功能
|
3天前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
3天前
|
存储 JavaScript 前端开发
JavaScript——JavaScript基础:数组 | JavaScript函数:使用、作用域、函数表达式、预解析
在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。①全局变量:不在任何函数内声明的变量(显式定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用。函数表达式与函数声明的定义方式几乎相同,不同的是函数表达式的定义必须在调用前,而函数声明的方式则不限制声明与调用的顺序。③块级变量:ES 6提供的let关键字声明的变量称为块级变量,仅在“{}”中间有效,如if、for或while语句等。
20 0
|
15天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
163 63