我正在研究JS和闭包的概念。
在下面的代码中,内部子函数查找num和num1的值。接下来,解释器沿着作用域链向上搜索它们。它在main((中查找,但没有看到它们,所以它继续到main的参数,在那里它在声明中看不到它们,但它们在调用中。这就是他们的来源。这就是我对代码工作原理的理解,对吗?
感谢
function main() {
return function child(num, num1) {
console.log(num + num1);
}
}
const result = main();
result(2, 4); // return 6
这里没有闭包。
您正在做的是创建一个返回另一个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);
之间没有实际差异(至少在您的问题范围内(
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();