JavaScript 中的自执行函数让我感到很奇怪,因为对于一个在解析期间就自己进行执行的这样一个特性,我从程序原理的角度怎么也看不明白,为了搞个清楚这个问题花了不少 时间,最后问题如下:1.自执行函数是匿名函数吗?2.匿名函数与函数式编程的关系是什么?3.匿名函数与lampda表达式有什么联 系?4.JavaScript 函数式编程实现?
之前有问过winter和catchen,他们有讲到js语言不是lampda表达式的一个实现,完全基于lampda的语言是lisp,而自执行函数的特性实现是由js引擎来完成的,这个应该是js语言的编译原理相关的东西。
今天看wiki的时候发现点新东西:
an anonymous function is a function (or a subroutine) defined, and possibly called, without being bound to an identifier.
Anonymous functions originate in the work of Alonzo Church in his invention of the lambda calculus in 1936 (prior to electronic computers), in which all functions are anonymous. The Y combinator can be utilised in these circumstances to provide anonymous recursion, which Church used to show that some mathematical questions are unsolvable by computation.
Anonymous functions have been a feature of programming languages since Lisp in 1958.
匿名函数是一个定义的函数(或子程序),可被调用,但不和一个标识符(引用)绑定。匿名函数起源于Alonzo Church在1936年研究的lambda 演算,在其中所有的函数都是匿名的.而Y组合子(高阶函数计算其他函数的不动点)可以利用匿名函数来进行匿名递归,Church用它来演示一些无法用计算 来解决的数学问题.
匿名函数自1958年的lisp出现后成为编程语言的一个特征.
1.那么自执行函数是匿名函数吗?
由其定义来看的确是,且在javascript中自执行函数是用来分割作用域的,并且在程序中只需要运行一次的函数完全可以写成自执行函数,再者自执行函数也可以被引用。
2.再来看第二个问题,匿名函数与函数式编程的关系?
因为函数式编程 以λ演算为基础,但λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。所以很必然的一个条件就是函数可以非常的随意,所以可以认为匿名函数的使用是函数式编程的必须条件。或者说没有匿名函数就没有函数式编程?
3.匿名函数与lampda表达式有什么联系?
lampda演算是数学理论,wiki上已经讲了,所以三者的关系应该是 lampda -> 匿名函数 -> 函数式编程.
及运用匿名函数这个方式来将lampda 演算 进行编程语言的实现。
4.JavaScript 函数式编程实现?
JavaScript 是函数编程语言吗?不是。纯函数式编程语言没有变量的概念,一切都是函数和递归。javascript是动态语言,动态语言有函数式编程的特性。所以它可以实现lampda演算。所以自执行函数是js函数式编程的特征体现?
花了一大把功夫,最后补了一点基础,留一个问题:自执行函数的运行时环境?(或者讲自执行函数的执行原理)