为什么需要使用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
是一个全局变量。一个足够聪明的Javascript引擎可以优化访问,因为Array
永远不会更改,因此它甚至可以通过值而不是引用来捕获proto
比Array.prototype.slice更快,因为只需要一次查找proto.slice
- 将
和opt_begin
作为opt_end
传递与通常不传递它们不同。被调用的函数可以知道是否传递了一个参数,并且恰好是undefined
,或者它是否没有被传递。使用未定义的
确保仅当参数实际传递给闭包时,才将参数传递给proto.slice.call(arguments,1)
slice
Array.prototype.slice
vsproto.slice
保存了一个查找总数(不确定这是否是正确的单词),因为我们必须首先将Array.prototype
作为参数传递。然后我们调用ret.slice
和ret.extend
,它们本身就是两个查找。。。那么,这段代码不会运行得更慢吗?创建闭包的查找只执行一次。在您的示例中,每次调用函数时都会执行此操作。最后一个问题。。。如果我们把proto设为局部变量,我的逻辑在这个测试中有什么问题吗@Crackers:在我看来,你是在衡量创建包装的时间(只做了一次),而不是实际调用包装的时间。你完全正确。我更新了测试。在我的浏览器上,这两种浏览器的性能都没有重大差异。