复制对本机JavaScript方法的引用是否安全?

时间:2011-02-02 22:15:46

标签: javascript reference native

例如

var w = document.getElementById;
var b = w('header');
var c = w('footer');
var d = w('body');

编辑:分号是另一个重要论点。我以为我会编辑这个问题很有趣。

修改:回复Andrey对其回答的评论。

“复制引用如何使JS编译器更有效?”
响应: JS编译器会缩短和/或混淆代码。如果有document.getElementById(..)有40个来电,那么如果他们调用getById(..)并将其重命名为O(..),则会更加紧凑。

“另外,当您处理html元素事件时,通常会指定一个js方法,并且在方法内部放置逻辑,而不是直接在html事件处理程序中 - 这不是必需的,而是一个好的做法”< / em>的
回复:我知道。但是我们有很多网络系统,他们很少完全遵循良好的做法。

“此外,使用内置方法直接使代码更具可读性” 回复:鉴于这两个例子,我认为后者更具可读性

document.getElementById('total').value = document.getElementById('subtotal').value + document.getElementById('salestax').value - document.getElementById('discount').value
document.getElementById('yousaved').value = document.getElementById('discount').value / (document.getElementById('subtotal').value + document.getElementById('salestax').value)

var byId = document.getElementById
byId('total').value = byId('subtotal').value + byId('salestax').value - byId('discount').value
byId('yousaved').value = byId('discount').value / (byId('subtotal').value + byId('salestax').value)

3 个答案:

答案 0 :(得分:3)

你的意思是

var w = document.getElementById

Thsi链接详细解释了为什么不应该这样做:JavaScript function aliasing doesn't seem to work

答案 1 :(得分:0)

嗯,碰巧它甚至不能在Chrome中运行。我想我可以在发布之前对其进行测试。我得到TypeError: Illegal invocation

替代方案是

var byId = document.getElementById

只需使用

function byId(a) {return document.getElementById(a)}

这不是那么有效,但它更短,许多编译器在转换时都没有问题

function getElementById(id) {return document.getElementById(id)}

进入

function q(a){return document.getElementById(a)}

编辑:感谢Andrey:我现在知道第一个例子不起作用的原因是因为我正在将document.getElementById更改为window.getElementById

以下工作在我的测试中,根据我正在阅读的内容,它应该可以在任何地方使用。

var d = document
d.i = d.getElementById

答案 2 :(得分:0)

实际上,事实证明,在使用gzip时,编译器的好处并没有用。 gzip在查找任何字符串时已经内置了重复数据删除功能。因此,如果每个文档实例后面都有一个点,它也会重复删除点。

事实上,如果你有一个带有字符串的变量,Google Closure Compiler将 - 默认情况下 - 用字符串本身替换对变量的所有引用,并删除变量并假设它将获利用gzip的帮助。

请参阅:https://groups.google.com/group/closure-compiler-discuss/browse_thread/thread/857bdaa095a8685e