脚本语言看起来功能强大,比面向对象语言更加难以理解,这实际上是因为脚本语言的抽象程度更高。
当然,这个世界上并不存在”空中楼阁”,抽象程度高、功能强大,说明它不可能是白手起家,而是必须站在巨人肩膀上。
而这个巨人,就是普通的编程语言,这种编程语言并不一定具备面向对象风格,而是例如汇编语言、基本的C语言这种。
实际上,脚本语言本质是基于解释器的,说白了,就是解释器把脚本语言先解释(翻译)成例如C语言这种普通的语言,然后通过C语言编译器变成可执行程序。
进一步,这种解释器是使用面向对象语言写的,例如C++。
那么,当写解释器的时候,其中蕴含着对语言的抽象,这才是脚本语言的本质。例如其中就运用了函数式语言思想。
这种抽象例如:解释型(一句句的翻译执行)、动态类型、闭包、可以运行命令、可以支持面向对象等等。
###一、闭包
闭包等于函数 + 函数所在上下文环境,说白了,函数内部的变量可以被函数外定义的上下文所影响。
在面向对象的语言中,类就是一种闭包,它把变量和方法绑定在一个环境中,可以相互使用。
理解:闭包这个概念更抽象(更有数学性质),而类只是一种简化的实现。
面向对象语言中,不允许函数里面定义函数这种情况,但是如果我们更加高级,能够抽象出闭包这个概念,
那么函数里面定义函数其实没什么,只要我们用解释器去处理好内部函数的上下文就行了(做词法分析)。
闭包的一种实用:就是事件驱动,例如网页的布局,按下按钮后,触发JS函数对环境进行修改,而这种过程中我们并不是传入所需的 参数给按钮,而是按钮根据约定俗成的外部变量名去操作,这很容易理解,因为它的外部是html格式,里面的关键字header、body都是 不会变的。
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures