为什么需要使用javascript?

为什么需要使用javascript?,javascript,Javascript,我在阅读的源代码,并偶然发现了这一点 var ret = (function(proto) { return { slice: function(arr, opt_begin, opt_end) { return proto.slice.apply(arr, proto.slice.call(arguments, 1)); }, extend: function(arr, arr2) { proto.push.apply(arr, arr2);

我在阅读的源代码,并偶然发现了这一点

var ret = (function(proto) {
  return {
    slice: function(arr, opt_begin, opt_end) {
      return proto.slice.apply(arr, proto.slice.call(arguments, 1));
    },
    extend: function(arr, arr2) {
      proto.push.apply(arr, arr2);
    }
  };
})(Array.prototype);
var slice = ret.slice;
var extend = ret.extend;
为什么这是必要的?为什么他们不能简单地写下这句话:

var slice = function(arr,opt_begin,opt_end) {
  return Array.prototype.slice.apply(arr,[opt_begin,opt_end]));
}
var extend = function(arr,arr2) {
  return Array.prototype.push.apply(arr,arr2);
}
编辑1:

回答重复的问题。我不认为这是重复的,但这个问题确实解决了我的问题。因此,这是一种优化。但不是每一个都只评估一次吗?那么,对于两个函数调用,这里真的有显著的改进吗


另外,如果我们担心性能,为什么我们调用
proto.slice.call(arguments,1)
而不是手工构建两个元素的数组
[opt\u begin,opt\u end]
,切片速度更快吗?

,因为语法非常酷。另外,你可以告诉自己它更干燥,从而使它的使用合理化。您不必输入两次
Array.prototype

我无法确定该代码背后的原始原理(只有作者知道),但我可以看到一些区别:

  • proto
    是一个封闭的局部变量,而
    Array
    是一个全局变量。一个足够聪明的Javascript引擎可以优化访问,因为
    proto
    永远不会更改,因此它甚至可以通过值而不是引用来捕获
    proto.slice
    比Array.prototype.slice更快,因为只需要一次查找

  • opt_begin
    opt_end
    作为
    undefined
    传递与通常不传递它们不同。被调用的函数可以知道是否传递了一个参数,并且恰好是
    未定义的
    ,或者它是否没有被传递。使用
    proto.slice.call(arguments,1)
    确保仅当参数实际传递给闭包时,才将参数传递给
    slice


它的可能副本也不会为您保存属性查找,因为闭包将添加1个属性查找。啊!现在调用slice而不是自己定义它是非常有意义的。但是
Array.prototype.slice
vs
proto.slice
保存了一个查找总数(不确定这是否是正确的单词),因为我们必须首先将
Array.prototype
作为参数传递。然后我们调用
ret.slice
ret.extend
,它们本身就是两个查找。。。那么,这段代码不会运行得更慢吗?创建闭包的查找只执行一次。在您的示例中,每次调用函数时都会执行此操作。最后一个问题。。。如果我们把proto设为局部变量,我的逻辑在这个测试中有什么问题吗@Crackers:在我看来,你是在衡量创建包装的时间(只做了一次),而不是实际调用包装的时间。你完全正确。我更新了测试。在我的浏览器上,这两种浏览器的性能都没有重大差异。