关于js的实质,前人已经指出,是c风格的lisp.越用越发现其事确实.
js 的核心代码只有两句:
第一句:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
第二句:
第一句包括了js对数据组织的观念.一对简单的 [], 里面盛放的可以是数据,可以是代码,可以充当数组,可以充当堆栈,队列,也可以充当哈希表,最后,又可以充当对象.
充当数组堆栈看看它的方法即可了解. 充当哈希表是怎么回事呢?
试看如下代码:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
js的对象即是通过哈希表来实现的,如上面的 a['name'], 变一种写法:
可见, 属性其实就是书写形式上的一个语法糖.
要给a对象增加一个方法,可以这样做:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在js的世界观里,对象就是代码块和属性块的杂凑.
坊间一般先介绍 function 模拟class, 其实远矣, js 的function模拟OO语言的类不过是js边边角角的一块.
请看上面的 fucntion() 内的this, 在该function被呼叫时, this所指的实际上是该块代码所属的a.
回头看这种写法:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
对比this的用法.在 [ ] 的理念里, this 代表的是一个先行声明的a, 而在 function Man 中,this代表的是一个未声明的新变量.该 function 被叫后为匿名变量设置name和sayHello两个成员. 在 var a = new Man() 执行后, 借助new 关键字, a 变量获得对该匿名变量的引用.
因此,在js里,function作为一种辅助机制,其功能是对代码块进行封装.
而代码块的执行, 在js的理念中,实为对文本的一段 eval(). 如代码
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
书写为以下形式,相信有助于了解它的实质:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
最后,请试验一下两次命令的alert(a.sayHello),观察 sayHello里究竟放的是什么.
到这一步,对于function的认识更加明朗了,其实就是给代码块做了一个包装+命名.
当然,没有 function 也是不行的.