(function($){})(jQuery);は何をしますか?平均?


299

私はjQueryプラグインの作成から始めています。私は3つの小さなプラグインを作成しましたが、実際にはそれが何を意味するのかわからずに、すべてのプラグインに行をコピーしています。誰かがこれらについてもう少し教えてもらえますか?おそらく、フレームワークを作成するときに説明が役立つと思います:)

これは何をしますか?(私はそれが何らかの形でjQueryを拡張していることを知っていますが、これについて知っておくべき他に興味深いものがあります)

(function($) {

})(jQuery);

プラグインを作成する次の2つの方法の違いは何ですか?

タイプ1:

(function($) {
    $.fn.jPluginName = {

        },

        $.fn.jPluginName.defaults = {

        }
})(jQuery);

タイプ2:

(function($) {
    $.jPluginName = {

        }
})(jQuery);

タイプ3:

(function($){

    //Attach this new method to jQuery
    $.fn.extend({ 

        var defaults = {  
        }  

        var options =  $.extend(defaults, options);  

        //This is where you write your plugin's name
        pluginname: function() {

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

私はここから離れていても、おそらく同じことを意味するかもしれません。私は混乱しています。Type 1を使用して作成していたプラグインでは、これが機能しないように見える場合があります。これまでのところ、Type 3が最もエレガントに見えますが、他についても知りたいです。


22
それは、ここでの時間をベッド、ちょうど手始めのために、だ(function($) { })(jQuery);それはので、コードをラップし$ているjQuery場合でも、そのクロージャ内の$通常の結果として、外部のそれの他の手段の何か、$.noConflict()例えば。これにより、プラグインが機能するかどうかが保証されます。$ === jQuery :)
Nick Craver

3
(function($) { })(jQuery)あなたについて言った:「私はそれが何らかの形でjQueryを拡張することを知っている[...]」。あなたの声明が100%偽であるので、明らかにあなたは知らない。ところで、それは将来の読者に誤解を招く可能性があります。これを見てください:stackoverflow.com/a/32550649/1636522

@NickCraverのコメントを拡張して、jquery-ui-1.7.2.custom.min.jsは次の例を使用します。jQuery.ui||(function(c){var i = c.fn.remove、d = c.browser。 mozilla ........})(jQuery);。旧バージョンのjQuery UIが非推奨のコードであることは知っていますが、重要なのは、その場合、「$」ではなく「c」を使用していることです。
ハイメモントーヤ

回答:


234

まず、次のようなコードブロックは、適切な(function(){})()場所で実行される関数にすぎません。少し分解してみましょう。

1. (
2.    function(){}
3. )
4. ()

2行目は単純な関数であり、括弧で囲んでランタイムに親スコープに関数を返すように指示します。関数が返されたら、4行目を使用して関数を実行すると、おそらくこれらの手順を読むことが役立ちます。

1. function(){ .. }
2. (1)
3. 2()

1が宣言、2が関数を返し、3が関数を実行しているだけです。

それがどのように使用されるかの例。

(function(doc){

   doc.location = '/';

})(document);//This is passed into the function above

プラグインに関する他の質問に関しては:

タイプ1:これは実際にはプラグインではなく、プラグインは関数である傾向があるため、関数として渡されるオブジェクトです。

タイプ2:$.fnオブジェクトを拡張しないため、これもプラグインではありません。結果は同じですが、これはjQueryコアの拡張です。これは、toArrayなどのトラバース関数を追加する場合です。

タイプ3:これはプラグインを追加するのに最適な方法です。jQueryの拡張プロトタイプは、プラグイン名と関数を保持するオブジェクトを取得して、プラグインライブラリに追加します。


2
あなたは元の質問を読んでいる場合、OPの指定クロージャを書くの3つの方法は、彼がそれらのメソッドタイプ{1,2,3}という名前の、私はミーリ..答えを質問内の領域を参照しています
RobertPitt

1
(function(){})は、内部の関数を返しますか?「()」は正確にはどういう意味ですか?
Jaskey 2015

私は最初の例が好きですが、行番号参照を使用した2番目の例(js機能ではありません)は不明確です。
Samy Bencherif、

1
:直ちに呼び出される関数式(生命維持)と呼ばれているbenalman.com/news/2010/11/...
アンドレス・ロハス

1
の外側の括弧を理解するのにほとんどの問題があります( function(){} ):これは正確に何ですか?書けfunction(){}()ませんか?
TMOTTM 2017

127

最も基本的なレベルでは、フォームの一部(function(){...})()は、すぐに実行される関数リテラルです。これは、関数を定義し、それをすぐに呼び出すことを意味します。

このフォームは、情報の非表示やカプセル化に役立ちます。関数内で定義したものは、その関数に対してローカルのままであり、外部からアクセスできません(通常、返されたオブジェクトリテラルを介して)。

この基本的なフォームのバリエーションは、jQueryプラグイン(またはこのモジュールパターン全般)に表示されるものです。したがって:

(function($) {
  ...
})(jQuery);

つまり、実際のjQueryオブジェクトへの参照を渡し$ていますが、関数リテラルのスコープ内として知られています。

タイプ1は実際にはプラグインではありません。オブジェクトリテラルをに割り当てるだけですjQuery.fnjQuery.fnプラグインは通常単なる関数なので、通常は関数をに割り当てます。

タイプ2はタイプ1に似ています。ここでは実際にプラグインを作成していません。オブジェクトリテラルを追加するだけですjQuery.fn

タイプ3はプラグインですが、プラグインを作成するための最良または最も簡単な方法ではありません。

これについてさらに理解するには、この同様の質問回答をご覧ください。また、このページでは、プラグインのオーサリングについて詳しく説明します。


1
Type 3がコアをどのように拡張しているかはわかりません。プロトタイプを拡張しているため、プラグインを作成するための完全に有効な方法です。少し不要ではありますが。
tbranyenは

1
私の悪い点-私はもっとはっきりしていたはずです。私は急いでいた、あなたは正しい。
Vivin Paliath、

32

少しの援助:

// an anonymous function
  
(function () { console.log('allo') });

// a self invoked anonymous function

(function () { console.log('allo') })();
  
// a self invoked anonymous function with a parameter called "$"
  
var jQuery = 'I\'m not jQuery.';

(function ($) { console.log($) })(jQuery);


21

説明に少しだけ追加

この構造(function() {})();IIFE(Immediately Invoked Function Expression)と呼ばれ、インタプリタがこの行に到達するとすぐに実行されます。したがって、これらの行を書き込んでいるとき:

(function($) {
  // do something
})(jQuery);

これは、インタープリターが関数をすぐに呼び出し、jQueryパラメーターとして渡し、関数内でとして使用されることを意味し$ます。


12

実際、この例は私が何を(function($) {})(jQuery);意味するのか理解するのに役立ちました。

このことを考慮:

// Clousure declaration (aka anonymous function)
var f = function(x) { return x*x; };
// And use of it
console.log( f(2) ); // Gives: 4

// An inline version (immediately invoked)
console.log( (function(x) { return x*x; })(2) ); // Gives: 4

そして今これを考慮してください:

  • jQuery jQueryオブジェクトを保持する変数です。
  • $(他のどのような変数名ですa$ba$bなど)と、それはPHPのように特別な意味を持ちません。

例をもう一度見てみましょう。

var $f = function($) { return $*$; };
var jQuery = 2;
console.log( $f(jQuery) ); // Gives: 4

// An inline version (immediately invoked)
console.log( (function($) { return $*$; })(jQuery) ); // Gives: 4

私にとっては、これが最良の答えです。明確でとてもシンプル
Saleh

11

タイプ3が機能するには、次のようにする必要があります。

(function($){
    //Attach this new method to jQuery
    $.fn.extend({     
        //This is where you write your plugin's name
        'pluginname': function(_options) {
            // Put defaults inline, no need for another variable...
            var options =  $.extend({
                'defaults': "go here..."
            }, _options);

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

誰かがjQueryプロトタイプのプロパティを直接設定するだけでなぜエクステンドを使用するのかわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.