了解 JavaScript 中的回调函数和闭包。
大家好,
在这篇文章中,我们将探讨 HOF(高阶函数)、回调和疯狂的 JavaScript 闭包,这些内容让我们在学习过程中的某个时刻感到头疼。
高阶函数
接受函数定义作为参数和/或返回函数的函数是 HOF(高阶函数)。
例如:
function isEven(n) {
return n % 2 === 0;
}
function printMsg(evenFunc, num) {
const isEven = evenFunc(num);
console.log(`The number ${num} is even: ${isEven}`);
}
printMsg(isEven, 2);
在上面的代码片段中,printMsg是高阶函数,因为它接受 isEven 函数作为参数。
回调
回调函数是将一个函数作为参数传递给另一个函数,以便稍后执行。在最后一段代码中,isEven就是一个回调函数。
之所以称为回调,是因为它回调到它被创建的地方。
我们再看一个例子。
let numbers = [1, 2, 4, 7, 3, 5, 6];
function isOddNumber(number) {
return number % 2 !== 0;
}
function oddNumbers = numbers.filter(isOddNumber);
console.log(oddNumbers); // [1, 7, 3, 5]
在上面的代码片段中,isOddNumber是回调函数。因为isOddNumber作为参数传递给了过滤函数。
回调函数可用于处理异步 JavaScript。
闭包
从执行上下文中,我们知道函数返回后,它会从调用栈中移除,并从执行上下文中删除。因此,记住这一点,这里是闭包的定义。
闭包是一种函数,即使在外部函数返回后,它仍然可以访问外部变量。
一旦外部函数返回,它就会从调用栈中移除,并从执行上下文中删除。但内部函数仍然可以访问外部函数变量。这个概念被称为闭包。
let x = 10;
function foo() {
let y = 20;
function bar() {
let z = 15;
return x + y + z;
}
return bar;
}
let test = foo();
test(); // 45
在上面的代码中,bar是闭包函数,即使外部函数返回后,它仍然可以访问外部变量(x 和 y)。
简化的闭包定义:
- 闭包是一种能够记住其创建环境的函数。
- 当一个函数从外部函数返回时,它会携带自身环境。
由于词法作用域的存在,JS 中可以使用闭包。词法作用域的意思是,如果在局部作用域中找不到某个变量,它会在外部作用域中查找,依此类推,直到全局作用域。
闭包中的异常
闭包只有一个例外。在 JavaScript 中,除了通过“new Function”语法创建的函数外,每个函数都是闭包。
通常,函数可以访问创建它的词法环境。但是,当通过“new Function”语法创建函数时,它无法访问词法环境,而是访问全局环境。
function getFunc() {
let value = "test";
let func = new Function('value', 'alert(value)');
return func;
}
getFunc()(); // Undefined
因此,诸如 func 之类的函数(在上面的代码中)无法访问外部变量,而只能访问全局变量。
好了,这篇文章就到这里。希望你能学到一些新东西,如果学到了,请分享并订阅我的新闻通讯,每周接收关于技能构建的精彩内容。
谢谢你!
文章来源:https://dev.to/swastikyadav/understanding-callback-functions-and-closures-in-javascript-154l