jq基本框架

(function(){
    var test=function(){
       return new test.prototype.init();
      
    }
    test.prototype={
       init:function(){
          
           return this;
       },
       name:function(){
           alert(123)
       }
    }
    test.prototype.init.prototype=test.prototype;
    $=test;
}())

上述代码就是jq典型的基本框架。这里用()把function括起来是为了防止变量污染,试想一下,如果整个jq里面的变量都是全局的,那得有多少个局部变量呢?

而这么多的全局变量,为防止变量重名,使用框架的人得有多辛苦啊。

因此,使用()将整个function括起来的好处显而易见。

当function函数前面有任何字符的时候,这个函数就变成了函数表达式,而不是函数声明了。也就是说,当语法分析程序分析到这里的时候,会立即解析这个函数,而不会把他加入到符号表当中,因此其他地方就无法找到这个函数了,因此得以防止污染。

1、使用function作用域,可以防止局部变量的污染

2、使用()可以把函数声明变成函数表达式,防止函数名污染

3、(function(){})()函数之后加上(),表示立即执行

然后这么随之而来也有一个问题了,如果全部都是局部变量的话,那么我们如何使用这个框架呢?

在js中,如果一个局部变量的前面没有使用var修饰的话,那么这个变量就是一个全局变量。因此,可以看到这个基本的框架的倒数第二行,将局部变量test赋值给$,$前面没有使用var修饰,因此,$是个全局变量。

再看到倒数第三行,因为我们使用的是new test.prototype.init();而在原型中

init:function(){

          

           returnthis;

       }

返回的是this。返回的这个this并不是类的实例,那么如何test自然就无法访问类原型的其他方法了。然后如果将类的原型赋值给init返回的值的原型,那么一切就井然有序了。

导入上面的函数,我们就可以在js中使用:$().name()了。

调用的顺序是:$()=test(),而test是一个函数,所以会执行这个函数。而这个函数只有一行return new test.prototype.init();



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值