我正在研究JS和闭包的概念。
在下面的代码中,内部子函数查找num和num1的值。接下来,解释器将在范围链中向上搜索它们。它看起来在main()中,但看不到它们,因此它会继续处理main的参数,在声明中看不到它们,但它们在调用中。那就是它们的来源。这就是我对这段代码的理解,对吗?
谢谢
function main() {
return function child(num, num1) {
console.log(num + num1);
}
}
const result = main();
result(2, 4); // return 6
答案 0 :(得分:1)
两者之间(至少在您的问题范围内)没有实际差异:
function name (foo) {
}
和
function name () {
var foo = arguments[0];
}
创建变量的范围只有两种方法。
因此,它不会在主体中查找变量声明,如果找不到,则在参数中查找一个变量声明。它只是在函数范围内查找变量。
答案 1 :(得分:1)
您的参数位于函数范围内。当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();
答案 2 :(得分:1)
这里没有关闭。
您正在做的是创建一个function
并返回另一个function
。
在您所在的行中:
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);