人生苦短,我用 JavaScript。 然鵝,其餘圈子裏還流行這樣一句話:人生苦短,我用 Python。 固然還有什麼完美秀髮編程,這就不提了。當你在前端學到必定地步的時候,你會有種想出去看一看的衝動,翻過這座山,去山的外面,看看外面的風景。雖然外面的風景也就那樣,可是仍是忍不住去看一看(%E8%B4%B1%E5%91%97%0A)。前端
做爲一個不安分的 FEE,我表示就算學了忘,我仍是會學的。學了忘,和歷來沒有學過,是徹底不一樣的概念。我記得有一個成語是這樣的,叫 舉一反三。web
一般咱們會這樣理解,我舉個例子,好比我學習 JavaScript,我經過學習 JavaScript 來慢慢通曉其餘相似的語言。可是我以爲咱們還能夠換種角度理解,好比我 JavaScript 學習的很好了,我想去學習 Python ,經過學習 Python 來反補個人 JavaScript ,經過 Python 的學習,使我對 JavaScript 的思考變得更深了。好比,import
等關鍵詞在 Python 中早就有了。其實我想說的是,當你學習的內容越普遍的時候,涉獵的知識越多的時候,看待事情的格局越高的時候,你會發現,不少問題,均可以用 萬變不離其宗 來解決。嗯....這哪是多說一句,明明就是一段。。。。編程
恩恩,,開始探索了啦!!緩存
我喜歡把其餘所學的知識和前端的知識進行比較。在整個較爲系統(看慕課視頻和閱讀好書)的學習了 Python 後。其實收穫仍是挺多的。安全
其實 PY 和 JS 有不少相同的地方,一個最重要的相同點就是: JS 和 PY 都是解釋型語言。解釋型語言俗稱腳本語言,翻開編程語言的歷史,會發現 Perl 語言的誕生是腳本語言走向成熟的標誌,有興趣能夠自行查閱資料去了解,若是想深刻了解編程語言原理,能夠看《編程語言原理》第10版,做者是賽巴斯塔。寫的很是棒!別問我爲何,由於我之前看過了,嘻嘻。網絡
其實解釋型語言和 Java 這種編譯型語言本質的區別就是以下一段話:閉包
解釋型語言是不須要開發者進行編譯的,是在運行程序時才被翻譯成機器語言。而Java
這種語言是須要開發者去手動編譯的,究竟哪一個好呢,其實無法去比較,要是說性能,確定是Java
的性能更好,由於一次編譯後,後面屢次運行就能夠直接運行字節碼文件,不須要再次編譯了。而JavaScript
、Python
這種語言,雖然性能差了點,每次運行都須要進行編譯,可是開發效率高啊,可移植性也很是好。給它一個rumtime,它送你一個快樂的人生。 並且,我是腳本語言,我慢咋了?沒聽過計算機科學領域有一句很是 NB 的名言麼:框架
計算機科學領域的任何問題均可以經過增長一個間接的中間層來解決。異步
根據這個理論,徹底能夠找到一個解決解釋型語言運行慢的方法,那就是JIT compilation,翻譯一下就是即時編譯,用一箇中間層,把翻譯的機器碼保存下來,等下次再次調用的時候,就直接從緩存中執行以前就已經編譯好的機器碼。編程語言
做爲腳本行業的翹楚,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一直向優雅、明確、簡潔的方向上努力前進。
吸星大法也是分等級的,吸的很差,可能會炸。
第一個關於分號這個事情:
編寫
PY
代碼時不加分號是一個標準,使用換行符做爲行代碼結束標誌。目前JS
主流的框架都提倡不加分號。目的很簡單:簡單高效。JS
往後的標準。
第二個關於關鍵字
PY
和JS
都使用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
,而後再讓解釋器去解釋新的代碼結構。
而後你懂的,根據命令來編譯出你想要的腳本語言。PY
和JS
結合爲一體,最終變成了:
人生苦短,我愛 PS。 卒
兄得,若是你也愛 PS ,就點個贊吧,嘻嘻。歡迎關注,後續系列將更加精彩😊!