Saturday, September 9, 2017

lexical binding v.s. dynamic binding

在 clojure 語言裡,變數可以是 lexical binding 也可以是 dynamic binding 。前者用於大多數的情況,因為這樣子寫,一眼就可以看出函數的依賴。後者多半用於一些 global 變數,而且是底層的函數才有在使用的 global 變數。這些 global 的變數,因為使用了 dynamic binding ,上層的函數就不需要一層又一層地去傳遞「變數的綁定」到最內層去。

範例在這邊:

javascript 的變數是採用 lexical binding 。但是, this 這個變數會隨著程式的運行,而指向不同的物件,this 顯然就是 dynamic binding 的變數。甚至 javascript 也提供了 bind 函數,可以用來明確地將函數與某個特定的物件做綁定。

有一種說法: 「Javascript 也可以算是一種 Lisp 的方言」。算不算是,自然是見仁見智。然而,如果我們從這個 lexical binding 和 dynamic binding 的角度來切入的話,確實是有特別的相似之處:因為都同時支持了兩種綁定方式。