ap = Array.prototype,
aps = ap.slice,
apsp = ap.splice,
我经常在不同的框架中看到上面的代码。这有什么好处? 为什么不直接使用它?
答案 0 :(得分:3)
如果完全按照您的使用方式使用,主要原因是减少将大量使用引用的方法或对象的代码中的键入量。此外,这可以具有减小脚本的整体大小的效果。考虑:
Array.prototype.someFunction1 = function () { /*someFunction1 */ };
Array.prototype.someFunction2 = function () { /*someFunction2 */ };
Array.prototype.someFunction3 = function () { /*someFunction3 */ };
Array.prototype.someFunction4 = function () { /*someFunction4 */ };
...(284个字符)与:
var ap = Array.prototype;
ap.someFunction1 = function () { /*someFunction1 */ };
ap.someFunction2 = function () { /*someFunction2 */ };
ap.someFunction3 = function () { /*someFunction3 */ };
ap.someFunction4 = function () { /*someFunction4 */ };
...有261个字符。琐碎,是的,但是在大规模上,这可以在分布式代码中产生足够的差异(想想Google托管的jQuery)。
然而,有时这样做是为了通过闭包保留范围:
var self = this;
this.someProperty = 5;
var myDiv = document.createElement('div');
myDiv.addEventListener('mousedown', function(e) { alert(self.someProperty); }, false);
答案 1 :(得分:2)
有几个好处:
我应该注意到,我认为这使代码对于不熟悉代码或其约定的人来说更不易读,因为代码不是自我记录的。每个人都知道Array.prototype.splice
是什么,但陌生人不知道aps
是什么,直到他们研究代码,追踪其定义并记住它是什么。
我在评论中被问到解释查找次数较少的问题:
要让口译员解决Array.prototype.splice
,必须执行以下操作:
Array
名称的本地范围。它找不到它。Array
名称的任何闭包(例如父作用域)。它找不到它。Array
名称的全局范围。它找到了它。Array
对象上,查找prototype
属性。prototype
属性上,查找splice
属性,现在它最终具有所需的功能。要让口译员解决aps
,必须这样做:
aps
名称的本地范围。它找到它而不是它具有它所需的功能。 aps
的预分配基本上预先完成了查找,因此它们已在运行时解析。这消除了一些灵活性,因为如果更改了splice或prototype属性的值,变量aps
将不会反映该更改,但是如果您知道它们不应该更改(运行时解释器不会不知道,然后你可以利用这个捷径。
答案 2 :(得分:1)
这种模式存在的一个功能原因是防止其他javascript代码改变特定方法的含义。基本上保护代码如下
Array.prototype.splice = function() {
// This is evil
};
另一个更可能的是,开发人员根本不想输入Array.prototype.splice
并且更喜欢像apsp
这样的较短版本。
答案 3 :(得分:0)
有两个好处。
a
比Array.prototype.slice
a
是单个查找,其中Array.prototype.slice
是多个查找所以基本上它们都是微观优化。这对图书馆很有价值,因为图书馆关心的是尽可能高效