作为参数的函数未在原型中定义但仍可以传入?

时间:2016-10-18 15:42:34

标签: javascript node.js function callback arguments

这是我在2016年的一本书中找到的异步函数的典型实现。我们声明var Obj,然后我们添加一个方法

Obj.prototype.doSomething(arg1_){}

然后我们称之为

test.doSomething(number, function(err,value){}

可以通过 arguments []

访问回调函数

var callback_ = arguments[arguments.length - 1];

所以即使回调函数没有被定义为原型中的参数,我们仍然可以传递它们?所以我们可以传递尽可能多的函数,即最多255个?

Here is a pastebin

var fib = function (n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
};
var Obj = function() { };
Obj.prototype.doSomething = function(arg1_) {
   var callback_ = arguments[arguments.length - 1];  
   callback = (typeof(callback_) == 'function' ? callback_ : null);
   var arg1 = typeof arg1_ === 'number' ? arg1_ : null;
   if (!arg1) return callback(new Error('first arg missing or not a number'));

   process.nextTick(function() {
     // block on CPU
     var data = fib(arg1);
     callback(null, data);
    });
}
var test = new Obj();
var number = 10;
test.doSomething(number, function(err,value) {
      if (err)
         console.error(err);
      else
         console.log('fibonaci value for %d is %d', number, value);
});
console.log('called doSomething');

2 个答案:

答案 0 :(得分:2)

是。它不需要在javascript中声明所有参数。您可以在arguments数组中检索。 查看一些示例here

您可以看到in this post最大参数数量足够大。

答案 1 :(得分:0)

Javascript并不限制你的参数数量。您可以使用一个参数定义函数,但使用0,1,2或100参数调用它。  使用arguments对象可以获得所有参数(以及其他一些东西),尽管它被认为有点难以阅读,并且在某些情况下它的行为与数组完全不同。