JavaScript里最难理解的就是闭包感念:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
说到这里 要引入一个gc回收时机:
我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
而上面那个例子确显示了切切相反的 ,因为b被a外的变量引用了,而i又被b引用了,所有a和b和i都不会被销毁。
JavaScript 的继承概念:
继承我知道的有这几种方式
1。通过 call方法 如:父类.call(this,参数);写在子类里。
2。通过prototype 如:子类.prototype=父类。
3.通过superclass 对于第三种看下面的例子,我有个例子在这本书的175页
function A(w,h){
this.width = w;
this.height = h;
}
A.prototype.area= function(){return this.width * this.heigth;}
B.prototype.superclass=A;
function B(x,w,h){
this.superclass(w,h);
this.x=x;
}
C.prototype.superclass=B;
function C(x,y,w,h){
this.superclass(y,w,h);
this.y=y;
}
new C(1,2,3,4);
这种方法作为简单继承的话 (如两个类的继承),是可以的。对于这个例子有三类之间的继承:
B是A的子类,C又是B的子类,B和C都使用superclass方法,当创建C的实例的时候B()构造函数将无限递归
为什么呢?
C的superclass是B ,而B的superclass是A
当调用C的superclass的时候(也就是B) 真的会调用B的superclass吗?关键就在于C的superclass把B的覆盖了。。
未完待续。。。。