需要JS闭包和范围链澄清



我正在研究JS和闭包的概念。

在下面的代码中,内部子函数查找num和num1的值。接下来,解释器沿着作用域链向上搜索它们。它在main((中查找,但没有看到它们,所以它继续到main的参数,在那里它在声明中看不到它们,但它们在调用中。这就是他们的来源。这就是我对代码工作原理的理解,对吗?

感谢

function main() {
return function child(num, num1) {
console.log(num + num1);
}
}
const result = main();
result(2, 4); // return 6

这里没有闭包。

您正在做的是创建一个返回另一个functionfunction

在你的行:

const result = main();

您将这个内部function存储在一个variable中。然后你用两个参数来调用它:

result(2, 4);

演示:

请检查这个演示,以及内部函数是如何存储在变量中的,然后调用。

function main() {
return function child(num, num1) {
console.log(num + num1);
}
}
//Store inner function in a variable
let innerFn = main();
console.log(innerFn);
console.log(typeof innerFn);
//Then call this function
innerFn();
innerFn(10, 4);

之间没有实际差异(至少在您的问题范围内(

function name (foo) {
}

function name () {
var foo = arguments[0];
}

创建作用域为函数的变量只有两种方法。


因此,它不会在主体中查找变量声明,如果找不到变量声明,则不会在参数中查找。它只是在函数的作用域中查找一个变量。

您的参数位于函数的范围内。当JS引擎遇到标识符时,它将首先查看当前执行的函数的范围(参数和变量(。如果它在那里没有找到那个变量,它将沿着作用域链向上移动,直到到达全局作用域。如果它找不到它,它将抛出一个引用错误。

例如:

let foo = 1;
let bar = 2;
function test () {
let foo = 5;

console.log(foo, bar);
}
test();

在本例中,函数内部创建的新foo覆盖了foo。JS引擎通过爬取作用域链来获取bar的值。

当创建函数时,闭包捕获函数的环境,例如:

function higher (value) {
let el = value
return () => console.log(el);
}
const first = higher(5)
const second = higher(2);
first();
second();