1.匿名函數(shù)概述
關(guān)于匿名函數(shù)的第一次認(rèn)識(shí)還是在jquery源碼里,打開(kāi)jQuery首先看到的是
(function( window, undefined ) {.......................})(window);
這就是一個(gè)匿名函數(shù),紅色為參數(shù),匿名函數(shù)的作用是創(chuàng)建一塊封閉區(qū)域,外面不能夠訪問(wèn)里面的變量和方法。
既然不能訪問(wèn),那怎么能調(diào)用jquery?這是因?yàn)閖query的匿名函數(shù)有這樣兩句話(藍(lán)色字):
(function( window, undefined ) {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
},
.........
window.jQuery = window.$ = jQuery;
})(window);
原來(lái)在匿名函數(shù)里將jQuery傳給了window,這也就是為什么參數(shù)的傳遞中要傳遞window,所以以后每次調(diào)用jquery其實(shí)是調(diào)用window的jQuery這個(gè)對(duì)象。
由jquery調(diào)用自己里面的方法。外面是無(wú)法調(diào)用的,這樣可以保證安全和不沖突。
2.接著上面的話題,關(guān)于jQuery的插件
以下是我寫(xiě)的分頁(yè)控件的部分代碼:
;(function ($) {
$.fn.tabing = function (arg) {
instance = new Plugin(this, arg);
};
var instance = null;
function Plugin(element){
this._tabs = $(element);
this._tabli = $("a[href*='#']",this._tabs);
this._tabDiv = this._tabs.siblings().filter("div[id*='tab']");
this.init();
}
Plugin.prototype = {
init: function(){
this._tabli.addClass("unselected");
this._tabli.eq(0).addClass("selected");
this._tabDiv.css("display","none");
this._tabDiv.eq(0).css("display","block");
this._tabli.each(function(){
$(this).bind("click",function(){
for(var i = 0;i<instance._tabDiv.length;i++){
instance._tabDiv.eq(i).css("display","none");
}
instance._tabDiv.filter("#"+$(this).attr("href").split('#')[1]).css("display","block");
});
})
}
}
})(jQuery);
注意紅色的字,其實(shí)jQuery插件也是在寫(xiě)匿名函數(shù),這樣保證每個(gè)插件的獨(dú)立性,要不怎么叫插件,紅色的字$.fn.tabing說(shuō)明在這個(gè)插件里面有個(gè)tabing給了jquery的fn,
這樣外面的jquery對(duì)象就可以直接調(diào)用tabing,這也是插件與外界的唯一接觸。
3. 說(shuō)完了jquery插件對(duì)匿名函數(shù)的使用,再說(shuō)一下window的匿名函數(shù)
其實(shí)jquery本身就是window的匿名函數(shù),即第一點(diǎn),那我們?cè)趺磳?xiě)window的匿名函數(shù)呢?
即寫(xiě)了匿名函數(shù)后,在函數(shù)里面有個(gè)與window交互的接口,例如下面:
(function(){
function getObjByID(id){
return document.getElementById(id);
}
function __addClass(id,className,classValue){
$(id).style.className=classValue;
}
window.addClass=__addClass;
})();
同樣是看紅色的字,這樣在該匿名函數(shù)外就可以調(diào)用addClass(),但無(wú)法調(diào)用getObjByID()。
4.匿名函數(shù)也會(huì)在解析的時(shí)候執(zhí)行
如下:
function Video() { };
function Movie() { };
var _video = new Video();
_video.size = 3;
_video.toString = function () {
return "video";
};
_video.getName = function () {
return "VideoXXX";
};
var _movie = new Movie();
(function (parent, child) {
for (var ele in parent) {
if (!child[ele]) //在child不包含該屬性或者方法的時(shí)候,才會(huì)拷貝parent的一份
child[ele] = parent[ele];
}
})(_video, _movie); //匿名函數(shù)調(diào)用的方式
alert(_movie.size); //3
alert(_movie.toString()); //[object Object]
alert(_movie.getName()); //VideoXXX
三個(gè)alert都有結(jié)果,說(shuō)明了匿名函數(shù)內(nèi)部執(zhí)行了。