写点什么

聊聊 JavaScript 和 Scala 的表达式 Expression

作者:Jerry Wang
  • 2023-04-15
    上海
  • 本文字数:880 字

    阅读完需:约 3 分钟

聊聊JavaScript和Scala的表达式 Expression

我们先看下面这段简单的 JavaScript 代码。


我在第 10 行调用了函数 f,其中传入的第二个和第三个参数都是一个逗号表达式。


函数 f 的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其返回值,否则直接打印传入的表达式的值。



执行上面这段代码,打印输出如下:



我们可以看出,虽然传入的第一个参数为 true,导致函数 f 内部只会打印第二个参数 y 代表的表达式的值,5,但是第三个参数代表的表达式在函数 f 调用时,也进行了表达式求值,所以最后 console 也输出了 Big calculation2。


如果我们想实现所谓的“惰性求值”,有时候也称”惰性计算“,那么只需要将原本写在表达式位置的逻辑用一个 JavaScript 函数包裹起来,如下:



再次调用 f,此时传入的参数 y 和 z 的类型为函数,因此在 f 进行调用时,同之前传入的表达式不同,这里并不会即时调用 y 和 z 代表的函数。打印输出:



我们再来看看 Scala 关于表达式的处理是否和 JavaScript 一致。


Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。


Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。


Scala 源代码被编译成 Java 字节码,所以它可以运行于 JVM 之上,并可以调用现有的 Java 类库。



下图第 5 行和第 12 行我分别定义了两个 Scala 函数 exp_test1 和 exp_test2, 逻辑和之前的 JavaScript 函数 f 类似。


exp_test1 接受的第二个和第三个参数类型为 exp1 :=> Unit,意思是需要传入一个表达式,这个表达式的返回类型是 Unit。


exp_test2 接收的第二个和第三个参数类型为 exp1() :=> Unit,意思是需要传入一个函数,这个函数没有任何输入参数,函数的返回类型是 Unit。



第 19 行到第 25 行是对这两个函数的各种测试,打印输出:



可以看到,即使传入两个函数 exp_test1 和 exp_test2 的第二个和第三个参数都是表达式,Scala 也能做到对表达式的惰性求值:


第 19 行和第 20 行的函数调用,第三个参数位置的表达式和函数都没有即时求值,而是惰性求值。


第 22 行和第 23 行的函数调用,第二个参数位置的表达式和函数都没有即时求值,而是惰性求值。


这个小例子说明了不同的编程语言,对于函数调用的表达式求值方式可能采取了不同的实现:惰性求值或者即时求值。



发布于: 刚刚阅读数: 4
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017-12-03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
聊聊JavaScript和Scala的表达式 Expression_JavaScript_Jerry Wang_InfoQ写作社区