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