0

遵循jQuery 插件模式methods.myfunc,如果我们使用 apply() 来定义this 和应用于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 个参数,则假定存在错误对象,但您也可以轻松传递两个参数,这没有问题!

更新:将代码中的函数从 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 回答