在javascript中套用参数无效

在javascript中套用参数无效

我正在尝试制作一个小的效用函数toPromise,它将使用回调的函数转换为一个Promise函数(使用Q)。
这是实用程序:

Object.defineProperty(Function.prototype, "toPromise", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(self) {
    var $this;
    $this = this;
    return function() {
      var args, deferred;
      deferred = Q.defer();
      args = arguments;
      args[args.length] = deferred.resolve;
      console.dir(args);
      $this.apply(self, args);
      return deferred.promise;
    };
  }
});


这是用法:

var f = function(nickname, name, callback){
  console.log(arguments)
  callback(undefined, name+" "+nickname);
};
f.toPromise(this)("a", "b").then(function(str){
  console.log(str)
});


但是输出是:

{ '0': 'a', '1': 'b', '2': [Function] } // This is debugging from utils
{ '0': 'a', '1': 'b' } // and from the function f

C:\test.js:4
  callback(undefined, name+" "+nickname);
  ^
TypeError: undefined is not a function


那么为什么没有在apply中传递第三个arg(在utils中)该函数呢?

最佳答案

arguments对象不是真正的数组:

>>> function getArguments() { return arguments; }
>>> var a = getArguments(1,2,3), b = [1,2,3];
>>> a[3] = 4; b[3] = 4;
>>> a
[1, 2, 3]
>>> b
[1, 2, 3, 4]
>>> a.length
3
>>> b.length
4


因此,如果您打算对其进行修改或将其传递给函数外部,则最好将其转换为真实数组:

var args = Array.prototype.slice.call(arguments);

关于javascript - 在javascript中套用参数无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23156796/

10-11 09:18