如何通过参数并应用于函数?

时间:2012-07-19 13:15:09

标签: javascript arguments pass-through

我有Uint8Array我想要使用slice方法。

所以我利用了这样的数组切片方法:

Array.prototype.slice.call(array, start, end);

现在我想外包一些常用的功能。
我用

试了一下
var utils = {
   slice: function() {
     return Array.prototype.slice.apply(this, arguments);
   }
};

但显然我误解了它是如何运作的。任何人都可以向我解释这个问题以及如何实现这个目标吗?

1 个答案:

答案 0 :(得分:3)

你的问题在于this不是你想象的那样。如果您致电utils.slice(foo, 1, 2)this将为utils

根据你想要调用它的方式,你可以将想要操作的对象作为第一个参数传递,然后你可以这样做:

var utils = {
   slice: function() {
     // The object we're operating on
     var self = arguments[0];
     // The rest of the arguments
     var args = Array.prototype.slice.call(arguments, 1);

     return Array.prototype.slice.apply(self, args);
   }
};

用法:

var someSlice = utils.slice(someArray, 2, 14);

另一个(也许更清晰)选项是使用命名参数:

var utils = {
    slice: function(array, from, to) {
        return Array.prototype.slice.call(array, from, to);
    }
};

这将以相同的方式工作。

更新:我很好奇为什么Uint8Array没有slice,我发现了subarray

Int8Array subarray(
  long begin,
  optional long end
);

请注意

  

注意:请记住,这是在现有缓冲区上创建新视图;对新对象内容的更改将影响原始对象,反之亦然。

这可能是你想要的 - 我打赌效率​​更高 - 如果你不需要复制数据,那就是!

相关问题