- 重载函数(Overloaded Function):
在一些静态类型的语言(如Java、C++)中,函数重载允许在同一作用域内定义多个同名函数,但每个函数的参数列表不同。JavaScript本身不支持函数重载,但是可以通过检查传入参数的数量或类型来模拟重载的效果。 - 构造函数(Constructor Function):
在JavaScript中,构造函数是一种特殊类型的函数,用于创建特定类型的对象实例。它通常与new
关键字一起使用,这样每次调用都会创建一个新的对象,并将其this
上下文绑定到新创建的对象上。
function Person(name, age) {
this.name = name;
this.age = age;
}
let person = new Person('Tom', 25);
- 惰性函数(Lazy Function):
惰性函数是指只有在真正需要时才执行求值的函数。这种函数通常用来创建只初始化一次的变量或对象,避免不必要的资源消耗。在JavaScript中,常见的惰性初始化方式是通过闭包实现单例模式。
let lazySingleton = function() {
let instance;
return function() {
if (!instance) {
instance = new SomeExpensiveObject();
}
return instance;
};
}();
// 第一次调用时初始化,后续调用返回同一实例
let obj = lazySingleton();
- 级联函数(Cascading Function):
级联函数是指一系列方法调用在一个表达式中连续发生,且每个方法返回的是调用自身的对象,以便进一步调用其他方法。在JavaScript中,jQuery库就广泛应用了级联调用。
let element = $('#myElement').addClass('active').show().css('color', 'red');
- 回调函数(Callback Function):
回调函数是一个作为参数传递给另一个函数的函数,该函数将在特定事件或条件满足后被调用。异步编程中广泛使用回调函数处理事件完成后的逻辑。
setTimeout(function callback() {
console.log('This is a callback function');
}, 1000);
- 高阶函数(Higher-Order Function, HOF):
高阶函数是可以接受一个或多个函数作为输入参数,或者输出为函数的函数。例如,JavaScript中的.map()
、.filter()
、.reduce()
等函数都是高阶函数。
let numbers = [1, 2, 3, 4, 5];
let squared = numbers.map(function square(n) {
return n * n;
});
- 柯里化函数(Currying Function):
柯里化是一种将一个多参数函数转换成一系列接受单一参数的函数的技术。每调用一次返回的函数,就会“记住”一部分参数,直到所有参数都被接收并最终执行原始函数。
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...moreArgs) {
return curried.apply(this, [...args, ...moreArgs]);
};
}
};
}
let add = curry((a, b, c) => a + b + c);
let sumThree = add(1)(2)(3); // returns 6
- 节流函数(Throttling Function):
节流函数限制某个函数在一定时间内只能被执行一次,即使在这段时间内多次触发。这常用于处理窗口滚动、resize等高频触发的事件,以减少不必要的计算和DOM操作。
function throttle(fn, delay) {
let lastCall = 0;
return function throttled() {
const now = Date.now();
if (now - lastCall > delay) {
fn.apply(this, arguments);
lastCall = now;
}
};
}
window.addEventListener('scroll', throttle(handleScroll, 100));
- 防抖函数(Debouncing Function):
防抖函数确保某函数在最后一次调用后等待一段时间再执行,若在这段时间内又被调用,则重新计时。主要用于防止短时间内频繁触发某一耗时操作。
function debounce(fn, delay) {
let timerId;
return function debounced() {
clearTimeout(timerId);
timerId = setTimeout(() => {
fn.apply(this, arguments);
}, delay);
};
}
window.addEventListener('resize', debounce(handleResize, 200));
- 记忆函数(Memoization Function):
记忆函数是一种优化技术,它缓存先前计算的结果,当下次遇到相同的输入时,直接返回缓存的结果,而不是重新计算。这对于那些具有相同输入总是产生相同输出的纯函数尤其有用。
function memoize(func) {
let cache = new Map();
return function memorized(...args) {
if (cache.has(args)) {
return cache.get(args);
} else {
let result = func.apply(this, args);
cache.set(args, result);
return result;
}
};
}
let expensiveComputation = memoize(function compute(a, b) {
// 这里是一些复杂的计算...
return a * b;
});
- 函数睡眠(Function Sleep):
JavaScript本身并没有内置的函数睡眠功能,但可以通过Promise结合setTimeout
模拟类似效果,让函数暂停一段时间后再继续执行。
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleepyFunction() {
console.log('Start');
await sleep(2000);
console.log('Wake up after 2 seconds');
}
- 偏函数(Partial Application / Partial Function):
类似于柯里化,偏函数是预先填充部分参数的函数,但它并不一定要一次性填满所有参数才能执行。这使得你可以固定部分参数提前准备函数。
function add(a, b) {
return a + b;
}
let addToFive = _.partial(add, 5); // 使用lodash库的_.partial
console.log(addToFive(3)); // 输出8
以上概念在现代JavaScript开发中非常常见,合理运用这些技术可以极大提升代码的效率和可读性。