javascript权威指南第五版 读后有感!!(读这本书之后的一些理解,和恍然大悟的感觉)包括闭包,继承和应用

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的覆盖了。。

 

 

 

未完待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值