(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();