本文深入解析 JavaScript 中返回函数的函数这一高阶技巧。通过对比原始代码、提取公共逻辑以及最终采用返回函数的方案,展示如何利用闭包消除重复代码。该方法不仅提升了代码的可读性与可维护性,还优化了执行效率,是理解 JavaScript 强大特性的关键技能。
返回函数的函数:核心概念与价值
此前我曾表达过对“返回函数的函数”这一编程模式的喜爱,但许多开发者对此感到陌生。掌握这一概念对于程序员至关重要,它能显著减少冗余代码,提升 JavaScript 的执行效率,并帮助你深入理解语言的核心优势。以下将通过几个具体示例,阐明这一技术的具体应用。
假设存在一个对象,其中包含两个子对象,它们各自拥有功能相似但细节略有差异的 get 方法。
从重复代码到外部函数提取
var accessors = {
sortable: {
get: function() {
return typeof this.getAttribute('sortable') != 'undefined';
}
},
droppable: {
get: function() {
return typeof this.getAttribute('droppable') != 'undefined';
}
}
};
重复的代码并非最佳实践,因此我们可以创建一个外部函数,该函数接收一个属性名称作为参数。
function getAttribute(attr) {
return typeof this.getAttribute(attr) != 'undefined';
}
var accessors = {
sortable: {
get: function() {
return getAttribute('sortable');
}
},
droppable: {
get: function() {
return getAttribute('droppable');
}
}
};
虽然上述改进有所好转,但仍存在冗余。更优的做法是直接返回最终所需的函数,从而避免多余的函数嵌套执行过程。
优化方案:直接返回函数
function generateGetMethod(attr) {
return function() {
return typeof this.getAttribute(attr) != 'undefined';
};
}
var accessors = {
sortable: {
get: generateGetMethod('sortable')
},
droppable: {
get: generateGetMethod('droppable')
}
};
/* 它跟最初的方法是完全等效的:*/
var accessors = {
sortable: {
get: function() {
return typeof this.getAttribute('sortable') != 'undefined';
}
},
droppable: {
get: function() {
return typeof this.getAttribute('droppable') != 'undefined';
}
}
};
*/
这就是所谓的“返回函数的函数”。每个子对象现在都拥有了自己的 get 方法,同时去除了中间层的函数调用开销。
这是一种极具价值的技术,能够有效消除重复且相似的代码。在适当场景下使用,可显著提升代码的可读性与可维护性。
你是否已经掌握了这一技巧?