本文实例讲述了jQuery中$原理。分享给大家供大家参考,具体如下:
1、外层沙箱及命名空间$
为了避免声明了一些全局变量而污染,把代码放在一个“沙箱执行”,jQuery具体的实现,都被包含在了一个立即执行函数构造的闭包里面,然后在暴露出命名空间(可以为API,函数,对象),如只暴露 $ 和 jQuery 这2个变量给外界:
(function(window, undefined) {
// 用一个函数域包起来,就是所谓的沙箱
// 在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
// 把当前沙箱需要的外部变量通过函数参数引入进来
// 只要保证参数对内提供的接口的一致性,还可以随意替换传进来的这个参数
"use strict";
window.jQuery = window.$ = jQuery;
... // jQuery代码
}) (window);jQuery有一个针对压缩优化细节,在代码压缩时,window和undefined都可以压缩为1个字母且确保它们就是window和undefined。外层函数只传了一个参数,因此沙箱执行时,u自然会undefined,把9个字母缩成1个字母,可以看出压缩后的代码减少一些字节数。
// 压缩策略
// w -> window , u -> undefined
(function(w, u) {
"use strict";
w.jQuery = w.$ = jQuery;
var a;
if (a == u)
return;
})(window);2、jQuery 无 new 构造
实例化一个jQuery对象的方法:
$('#text').text('myJQuery'); // 无 new 构造等价于:
var text = new $('#text');
text.text('myJQuery');使用jQuery时一般都使用无new的构造方式,直接
$('')进行构造,这也是jQuery十分便捷的一个地方。当使用无
new构造方式时,其本质是相当于
new jQuery(),在jQuery内部的实现方式是:
(function(window, undefined) {
// ...
jQuery = function(selector, context) {
// 实例化方法jQuery()实际上是调用了其拓展的原型方法 jQuery.fn.init
return new jQuery.fn.init(selector, context, rootjQuery);
},
// jQuery.prototype是jQuery的原型,挂载在上面的方法,即可让所有生成的jQuery对象使用
jQuery.fn = jQuery.prototype = {
// 实例化方法,这个方法可以称作 jQuery 对象构造器
init: function(selector, context, rootjQuery) {
// ...
}
}
// jQuery 没有使用 new 运算符将 jQuery 实例化,而是直接调用其函数










