2017-04-03 38 views
3

我最近遇到了一个JavaScript脚本,其中作者似乎试图避免他的代码中的字符串,并将所有内容都分配给一个变量。避免字符串和硬编码函数名称 - 优势?

所以不是

document.addEventListener('click', (e) => { /*whatever*/ }); 

他会写

var doc = document; 
var click = 'click'; 
var EventListener = 'EventListener'; 
var addEventListener = `add${EventListener}`; 
doc[addEventListener](click, (e) => { /*whatever*/ }); 

虽然缓存document到一个变量可以被视为微的优化,我真的不知道是否有这种做法的其他任何好处一般来说 - 可测试性,速度,维护,什么?

传统的IE attachEvent应该已经差不多了,所以能够快速让脚本在这些环境下运行,我认为这并不是一个好处。

+3

也许他害怕失去工作,并写下只能由他维护的代码...... :-) – baao

+1

这对我来说似乎很奇怪 - 尽管避免[魔术字符串](https:///en.wikipedia.org/wiki/Magic_string),并且将字符串存储在字符串可能会更改的变量中,但语义“var”名称将保持不变是很好的做法,我无法想象如何执行前端Web工作'click'会改变,或者'document'会以某种方式成为不同的对象...... –

+1

版权陷阱,也许? – Schlaus

回答

1

你给的例子看起来很奇怪,我无法想象大多数这些举动的任何“良好实践”理由。我的第一个猜测是,这是一个不确定自己在做什么的人的工作,但他们也会使用ECMAScript 6语法很奇怪。

另一种可能性是这是生成的代码(例如某种可视化编程工具的输出,或者缩小器)。在这种情况下,通常会看到这种过度分解,因为代码是从保守编写的模板生成的,以防止出现错误;我正在考虑C语言中的预处理宏的方式使用括号。

有时候,变量声明是以一种方式写入的,它向变量(和编译器和/或读者)说明该变量保存了什么类型的数据。例如,asm.js代码使用不必要的变量声明作为在常规JS上实现强类型变量的技巧。有时,声明是以文档形式编写的(如果您看到var foo = Math.PI * 0,则可能是foo是以弧度表示的角度,因为否则作者将只写入var foo = 0.0)。但这仍然不能解释像var click='click'