JavaScript 精粹:原型扩展、闭包与高阶函数实现
本文整理自《JavaScript 精粹》,通过代码片段演示了如何为内置对象扩展方法,利用闭包解决循环中的变量捕获问题,以及实现函数柯里化和记忆化递归。内容涵盖原型链操作、作用域隔离及性能优化技巧,适合深入理解 JavaScript 核心机制的开发者参考。
JavaScript 原型扩展方法
// 为构造函数原型添加方法
Function.method = function(name, func) {
this.prototype.name = func;
}
Number.method("integer", function() {
return Math[this < 0 ? 'ceil' : 'floor'](this);
});
(-10/3).integer(); // -3
String.method("trim", function() {
return this.replace(/^\s+|\s+$/g, '');
})
" neat ".trim(); // neat
利用闭包管理状态与事件
// 闭包
var quo = function(status) {
return {
get_status: function() {
return status;
}
}
}
var myQuo = new quo("amazed");
myQuo.get_status(); // amazed
// 闭包经典例子片段
for (var i = 0; i < lis.length; i++) {
lis.onclick = function(i) {
return function() {
alert(i);
};
}(i);
}
函数柯里化与记忆化递归
// 套用
Function.method("curry", function() {
var slice = Array.prototype.slice,
args = slice.apply(arguments),
that = this;
return function() {
return that.apply(null, args.contact(arguments));
}
})
// 记忆 递归
var memoization = function(memo, usefn) { // 抽象化
var fn = function(n) {
var result = memo[n];
if (typeof result !== 'number') {
result = usefn(fn, n);
memo[n] = result;
}
return result;
};
return fn;
};
var factorial = memoization([0, 1], function(fn, n) { // 递归的形式
return fn(n - 1) * n
});
factorial(5) // 120
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
JavaScript函数定义的三种方式:声明、表达式与箭头函数
2026-11-05 13:50:55
JavaScript中escape、encodeURI和encodeURIComponent对空格的处理差异
2026-11-05 12:47:23
