0

jQueryプラグインのパターンに従って、 apply()を使用してスコープを定義し、これに適用methods.myfuncした場合、関数、たとえば関数のアリティをどのように見つけることができますか?this arguments

(function($, window, document ){

"use strict";
//...
methods = {
  myfunc: function(){
    // myfunc.length? tried, didnt work
    // arguments.length? tried, didnt work
    // methods.myfunc.length? tried, didnt work
    // arguments.callee tried, doesnt work in strict mode
  }
  //...
}

$.MyPluginThing = function( method ){

  if( methods[method] ){
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
  }else if( typeof method === "object" || ! method ){
      return methods.init.apply( this, arguments, window );
  }else{
      $.error( "Method " +  method + " does not exist on jQuery.MyPluginThing" );
  }

}...

これは、関数スコープに関する私の無知の一部を明らかにするかもしれませんが、私はここでかなり困惑しており、これを十分に説明する例を見つけていません。

この質問に対する私のインスピレーションの一部は、NodeJS / ExpressJSから来ています。ここでは、いくつかの関数に対して可変数の引数があります。たとえば、3つの引数が渡された場合、エラーオブジェクトがあると想定されますが、2つを渡すことも簡単にでき、問題はありません。

更新:コードの関数をinitからmyfuncに変更しました

4

1 に答える 1

3

名前付き関数式を使用する必要があります(そのすべての特異性を含む):

var methods = {
  init : function init () {
    var arity = init.length;
  }
};

これがフィドルです:http://jsfiddle.net/tqJSK/

正直なところ、なぜこれが必要になるのかわかりません。名前付き引数の量は決して変更されないため、関数内でその番号をハードコーディングできます...


更新: @TJCrowderが指摘しているように、代わりに通常の関数宣言を使用できます。

(function($, window, document) {

    function init () {
        var arity = init.length;
    }

    var methods = {
      init : init
    };

}(jQuery, window, document));

更新2:探しているのがこの特定の呼び出しで提供される引数の数だけである場合は、次を使用してarguments.lengthください:

var methods = {
  init : function () {
    var count = arguments.length;
  }
};

これがフィドルです:http://jsfiddle.net/tqJSK/1/

于 2013-01-13T07:51:46.770 に答える