Javascript被误解的程度似乎出人意料,这门简单得不能再简单的脚本语言用最简单的规则展现出了各种有趣的特性,不断地学习和探索中,我一次又一次的刷新我的认识。
在js的高手中 披着c外衣的lisp被广泛的认可 我想这来自于那篇著名的文章 javascript 世界上最被误解的语言。然而我不同意这种说法 支持函数式编程就是LISP的近亲吗? 这就是原文中的一段:
Lisp in C's Clothing
JavaScript's C-like syntax, including curly braces and the clunky for statement, makes it appear to be an ordinary procedural language. This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists. Functions are first class. It has closures. You get lambdas without having to balance all those parens.
arrays instead of lists Array是一个索引表 它由object实现 js也可以实现linklist,arrays instead of lists就显得牵强了,作为js的内置类型 Array的地位很低 基本上属于库级的内容 跟把list作为核心的lisp是有本质不同的
objects instead of property lists js的objects其实就是hashtable 这一点几乎无需置疑 oo不是lisp的特性 也不是lambda演算的特性 js的object跟c++的完全不同 应该说它是c++类的动态版 可以随时添加属性 改变大小,还有很强的反射机制。
Functions are first class. It has closures. 这就是错误的根源了 js的function是什么? js的function是类!因为他的名字而把它看作是跟我们认识中的函数相类似的东西是个根本的错误!
js在funcional和oo之间找到了一个完美的结合点 然而 它却混淆了我们的视线 js的函数声明时声明了一个类 每次执行则把它实例化 只有这样才能解释js函数的行为 执行的总是js函数的实例
函数非函数 闭包自然也就非闭包了 所谓的闭包 其实是运行时实例化而成的对象的作用域。