1. 無名関数の概要
私が匿名関数について初めて知ったのは、jQuery のソース コードでした。jQuery を開いて最初に目にしたのは、
次のようにコードをコピーします。
(関数( ウィンドウ, 未定義 ) {..................................})(ウィンドウ);
これは匿名関数であり、パラメーターは赤色で示されています。匿名関数の機能は閉じた領域を作成することであり、内部の変数やメソッドには外部からアクセスできません。
アクセスできないのでjqueryを呼び出すにはどうすればよいでしょうか?これは、jquery の匿名関数に次の 2 つの文 (青色のテキスト) があるためです。
次のようにコードをコピーします。
(関数(ウィンドウ、未定義) {
// jQuery のローカル コピーを定義します
var jQuery = 関数(セレクター、コンテキスト) {
// jQuery オブジェクトは実際には「強化された」init コンストラクターにすぎません
return new jQuery.fn.init( セレクター, コンテキスト );
}、
……
window.jQuery = window.$ = jQuery;
})(ウィンドウ);
jQuery は匿名関数で window に渡されることがわかりました。これがパラメータを渡すときに window が渡される理由です。そのため、今後 jquery が呼び出されるたびに、実際には window の jQuery オブジェクトが呼び出されます。
jquery は独自のメソッドを呼び出します。外部から呼び出すことができないため、安全性が確保され、競合が発生しません。
2. 上記のトピックの続き、jQuery プラグインについて
以下は、私が作成したページング コントロールのコードの一部です。
次のようにコードをコピーします。
;(関数 ($) {
$.fn.tabing = 関数 (引数) {
インスタンス = 新しいプラグイン(this, arg);
};
var インスタンス = null;
関数プラグイン(要素){
this._tabs = $(要素);
this._tabli = $("a[href*='#']",this._tabs);
this._tabDiv = this._tabs.siblings().filter("div[id*='tab']");
this.init();
}
プラグイン.プロトタイプ = {
初期化: function(){
this._tabli.addClass("未選択");
this._tabli.eq(0).addClass("選択済み");
this._tabDiv.css("表示","なし");
this._tabDiv.eq(0).css("表示","ブロック");
this._tabli.each(function(){
$(this).bind("クリック",function(){
for(var i = 0;i<instance._tabDiv.length;i++){
instance._tabDiv.eq(i).css("表示","なし");
}
instance._tabDiv.filter("#"+$(this).attr("href").split('#')[1]).css("表示","ブロック");
});
})
}
}
})(jQuery);
実際、jQuery プラグインは各プラグインの独立性を保証する匿名関数も記述していることに注意してください。それ以外の場合、赤い文字 $.fn.tabing はそれを示しています。このプラグインには jquery の fn 用のタブがあります。
このようにして、外部 jquery オブジェクトはタブを直接呼び出すことができます。これは、プラグインと外部との間の唯一の接点でもあります。
3. jquery プラグインによる匿名関数の使用について話した後、window の匿名関数について話しましょう
実は、jquery自体がwindowの匿名関数なのですが、それが最初のポイントです。では、windowの匿名関数をどうやって書くのかということです。
つまり、匿名関数を作成した後、次のような関数内のウィンドウと対話するためのインターフェイスが存在します。
次のようにコードをコピーします。
(関数(){
関数 getObjByID(id){
document.getElementById(id) を返します。
}
function __addClass(id,className,classValue){
$(id).style.className=classValue;
}
window.addClass=__addClass;
})();
また、赤い文字に注目してください。つまり、匿名関数の外側で addClass() を呼び出すことができますが、getObjByID() を呼び出すことはできません。
4. 解析中に匿名関数も実行されます
次のように:
次のようにコードをコピーします。
関数ビデオ() { };
関数ムービー() { };
var _video = 新しいビデオ();
_video.size = 3;
_video.toString = 関数 () {
「ビデオ」を返します。
};
_video.getName = 関数 () {
「ビデオXXX」を返します;
};
var _movie = 新しいムービー();
(関数(親、子) {
for (親の変数 ele) {
if (!child[ele]) //子に属性またはメソッドが含まれていない場合にのみ、親のコピーがコピーされます。
子[エレ] = 親[エレ];
}
})(_video, _movie); //匿名関数の呼び出し方法
アラート(_movie.size); //3
alert(_movie.toString()); //[オブジェクト オブジェクト]
アラート(_movie.getName()); //ビデオXXX
3 つのアラートにはすべて結果があり、匿名関数が内部で実行されたことを示します。