前端猎奇系列之探索Python来反补JavaScript——上篇

写在最前

人生苦短,我用 JavaScript。 然鹅,其余圈子里还流行这样一句话:人生苦短,我用 Python。 固然还有什么完美秀发编程,这就不提了。当你在前端学到必定地步的时候,你会有种想出去看一看的冲动,翻过这座山,去山的外面,看看外面的风景。虽然外面的风景也就那样,可是仍是忍不住去看一看(%E8%B4%B1%E5%91%97%0A)。前端

多说一句

做为一个不安分的 FEE,我表示就算学了忘,我仍是会学的。学了忘,和历来没有学过,是彻底不一样的概念。我记得有一个成语是这样的,叫 举一反三web

一般咱们会这样理解,我举个例子,好比我学习 JavaScript,我经过学习 JavaScript 来慢慢通晓其余相似的语言。可是我以为咱们还能够换种角度理解,好比我 JavaScript 学习的很好了,我想去学习 Python ,经过学习 Python 来反补个人 JavaScript ,经过 Python 的学习,使我对 JavaScript 的思考变得更深了。好比,import等关键词在 Python 中早就有了。其实我想说的是,当你学习的内容越普遍的时候,涉猎的知识越多的时候,看待事情的格局越高的时候,你会发现,不少问题,均可以用 万变不离其宗 来解决。嗯....这哪是多说一句,明明就是一段。。。。编程

恩恩,,开始探索了啦!!缓存

出自一家门

我喜欢把其余所学的知识和前端的知识进行比较。在整个较为系统(看慕课视频和阅读好书)的学习了 Python 后。其实收获仍是挺多的。安全

其实 PYJS 有不少相同的地方,一个最重要的相同点就是: JSPY 都是解释型语言。解释型语言俗称脚本语言,翻开编程语言的历史,会发现 Perl 语言的诞生是脚本语言走向成熟的标志,有兴趣能够自行查阅资料去了解,若是想深刻了解编程语言原理,能够看《编程语言原理》第10版,做者是赛巴斯塔。写的很是棒!别问我为何,由于我之前看过了,嘻嘻。网络

其实解释型语言和 Java 这种编译型语言本质的区别就是以下一段话:闭包

解释型语言是不须要开发者进行编译的,是在运行程序时才被翻译成机器语言。而Java这种语言是须要开发者去手动编译的,究竟哪一个好呢,其实无法去比较,要是说性能,确定是Java的性能更好,由于一次编译后,后面屡次运行就能够直接运行字节码文件,不须要再次编译了。而JavaScriptPython这种语言,虽然性能差了点,每次运行都须要进行编译,可是开发效率高啊,可移植性也很是好。给它一个rumtime,它送你一个快乐的人生。 并且,我是脚本语言,我慢咋了?没听过计算机科学领域有一句很是 NB 的名言么:框架

计算机科学领域的任何问题均可以经过增长一个间接的中间层来解决。异步

根据这个理论,彻底能够找到一个解决解释型语言运行慢的方法,那就是JIT compilation,翻译一下就是即时编译,用一个中间层,把翻译的机器码保存下来,等下次再次调用的时候,就直接从缓存中执行以前就已经编译好的机器码。编程语言

JS一直在吸取PY的优势

做为脚本行业的翘楚,PY一直扮演着高贵的角色,PY的设计哲学是优雅、明确、简单。而回头望一眼当初用了10天就发明出来的JS,我发现JS就好像一个白手起家的屌丝(人穷志不穷)。经过农村包围城市的方法,一步一个脚印,最终杀出一片属于本身的天空。

为何要这样说呢,是由于我我的理解的,JS在被创造出来的时候,并无给与太大指望,这也致使了不少东西在创造出来的时候没有考虑到,好比JS是基于面对对象进行设计的,可是却没有类、继承等面对对象的语言所必须拥有的特性。而PY从被设计之初就已是一门面对对象的语言了。我举个栗子,JS中的this,有多种指向,对于刚入门前端的同窗,是一个很难理解的知识点。纵观整个OOP(面对对象编程)语言,this的指向都很明确,指向由类建立出来的对象。而在JS中,正是由于设计之初的定位模棱两可,说是OOP,缺没有实现类等特性,但又是基于面对对象进行设计的。

既然没有在语言设计层面给出相应的关键字,例如class关键字,若是没有类,那JS还有什么,那就都是函数了丫😂,OOP的不明显,那剩下的只能OPP(面向过程)了呀😂。那这样一来,this的指向就会变得有多种状况,具体状况就不说了,自行查阅资料。可是呢,是时候拿出名言了:

计算机科学领域的任何问题均可以经过增长一个间接的中间层来解决。

你说没有class关键字 ? 没法实现继承? 没法实现多态性?不存在的,我就算饿死,我也会把这个实现了。嗯....真香~~ 而后就出现了一开始的使用原型链来实现继承,同时为了减小内存消耗,能够优化成组合继承。其实这一切的一切,都是为了填当初设计时没有规划好的坑,前同事挖坑,我来填。再后面,等ES6出来的时候,终于可使用class来写OOP了。可是这个class也只是语法糖,说白了同事留下的坑,已经深刻地心了!全世界都在用,我能怎么办?我心里谎的一笔,不能直接从根本上进行修改,那只能采起靠上面那句名言了,我造一个间接的中间层来实现class功能,其余的底层我都不动,向下兼容,毕竟用户是全世界。因此日子久了,你造一个中间层,我造一个中间层,而后JS变成的愈来愈优雅、明确、简洁。日子就愈来愈好了。

在全世界的FEE的努力下,JS一直向优雅、明确、简洁的方向上努力前进。

JS是如何吸取PY的

吸星大法也是分等级的,吸的很差,可能会炸。

第一个关于分号这个事情:

编写PY代码时不加分号是一个标准,使用换行符做为行代码结束标志。目前JS主流的框架都提倡不加分号。目的很简单:简单高效。JS往后的标准。

第二个关于关键字

PYJS都使用import做为模块导入关键词

第三个关于函数

都有闭包、匿名函数,均可以使用lamada表达式。

这里说一下,其实有些其余语言也有,我学习PY的目的是为了反补JS,让我换个角度去看个人小可爱JS。其实在前端,不少人搞不清楚闭包。知其然,不能知其因此然。为何会出现这种状况呢?

我我的认为,最主要的缘由是由于闭包在JS语言中扮演着很重要的角色,说开点就是用到闭包的地方和场景太多了,不少场景必须使用闭包才能完成,而后呢闭包在不少场景的做用也不同。不少刚入贵圈没多久的宝宝,还只停留在很浅的理解上。好比防止全局变量污染、模块化等。并不能深刻的理解到闭包在JS中的重要做用。想透彻掌握闭包,那编译语言原理是确定要掌握或者了解的。

闭包在JS中有多重要,我我的认为:闭包在不少语言中都存在,但JS对闭包的依赖,超过其余任何语言对闭包的依赖。为何这么说呢?咱们把格局放的大一点:从编程语言原理的角度来看来闭包,闭包其实就是:

一个子程序和定义它的引用环境。也就是若是子程序能够从程序的任意位置调用,就须要引用环境。

中断一下,先不看闭包,你会发现有个词很陌生,叫引用环境。其实这里的引用环境也叫做用域。不一样叫法而已,那么问题来了,引用环境(做用域)是什么东东?

引用环境(做用域)是指这条语句中全部可见变量的集合。

怎么理解这句话,其实这句话对你理解前端常常提的做用域很是很是重要,请看一个很是简单的代码:

const g = 'haha'
const a = 'i am godkun'
function fun() {
  let b = 'hello world'
  console.log(b + a)
}
fun()
复制代码

OK,看上面代码,fun()语句的做用域是什么?按照静态做用域语言的特性,你要去fun函数的代码执行处去看,经过fun函数能够知道,fun函数的做用域(引用环境)就是fun函数体内的局部做用域中声明的的变量b和全局做用域下的变量a的集合,这里强调一点,就算全局变量g没有被fun函数使用。那也是算在fun函数的引用环境里的。

总结一下就是: 在静态做用域语言中,语句的引用环境是在它的局部做用域中声明的变量,和在它的祖先做用域中声明的全部可见变量的集合。

好了,继续开始闭包吧,也就是若是做用域为静态的编程语言不容许嵌套子程序,那闭包就没有什么用。若是容许嵌套子程序,那就支持闭包。这种容许嵌套子程序的语言中,子程序引用环境中的全部变量(其本地变量和全局变量)都是可访问的,不管子程序在程序的什么地方调用。 这句话很差理解,咱们能够以JS为例子进行通俗阐述:

JS是一个静态做用域语言,同时容许嵌套子程序,若是JS不容许嵌套子程序,那一首凉凉送给小可爱JS啊。什么是静态做用域语言,官方解答就不说了, 我通俗点说,就是你的JS程序在声明时,就已经肯定好做用域了。学习过编程语言原理的应该知道 静态做用域又叫作词法做用域,使用词法做用域的变量叫词法(lexical)变量。

function say() {
  let str = 'hello world'
  console.log(str)
} 
复制代码

从上面能够知道,变量str就是词法变量。那么最核心的本质要出来了。

词法变量都有一个肯定的做用域和不肯定的生存期。

词法变量的做用域能够是一个函数或block,使得其在这段代码区域内都有效。自从JS支持了块级做用域(let声明的也不能算真正意义上的块级做用域,不说这个了),这个block也就成为了现实。不过为何说词法变量的生存期不肯定呢,是由于词法变量的生存期取决于该变量须要引用多久。而引用多久,这是咱们能够人为控制的。而人为控制老是会不靠谱的。因此就诞生了 GC 这种神器。

你会发现,从上面的静态做用域能够知道,应该还存在动态做用域。动态做用域是什么呢,不说了!,毕竟和JS无关。我只说我反补的!说到这,我是否是应该写个闭包文章,算了吧,之后再说吧。

发现说不完了

一原本想一篇搞定的,发现写着写着收不住了,一想到我今天9点(写到这时间已1542994654097)还要参加VueConf,明天还要参加上海的谷歌开发者大会。而后刺激的是今天我要5点起床作高铁,嗯,默默的在文章标题最后加了 ——上篇, 我仍是收手睡觉吧。

其实我学习PY的目的是为了反补JS,经过PY来看清楚JS。其实学习服务端语言,对前端有一个很重要的帮助,就是能够深刻理解Web编程中的关于网络方面的不少知识,TCP/IP 、 Socket 、HTTP等等,以及在web安全方面,服务端是如何作的。等等吧,下篇再说吧,固然还有我学习PY后的一次小实战,也算是学有所用吧。虽然用途不大,可是有趣就好。

可能有人会说,Node.js不也是服务端语言么,为何不学习Node.js,这个我要说一下,Node.js我也学丫。好比Node.js源码中就大量用到了闭包,异步IO操做就用到了闭包。可是Node.js也是用JS写的😂,我是猎奇系列,因此Node.js 不考虑在内。

PY有装饰器,JS没有,可是伟大的转译器Babel能够解决这个问题,我以为能够脑补一下,Babel这种神器之后甚至能够统一脚本语言。按照Babel规定的语法规范写,而后Babel经过对现有的代码进行分析,解析成AST,而后转换,生成新的AST,而后再让解释器去解释新的代码结构。

而后你懂的,根据命令来编译出你想要的脚本语言。PYJS结合为一体,最终变成了:

人生苦短,我爱 PS。 卒

兄得,若是你也爱 PS ,就点个赞吧,嘻嘻。欢迎关注,后续系列将更加精彩😊!

相关文章
相关标签/搜索