JS闭包和作用域链需要澄清

时间:2018-08-06 13:46:54

标签: javascript function scope closures

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

在下面的代码中,内部子函数查找num和num1的值。接下来,解释器将在范围链中向上搜索它们。它看起来在main()中,但看不到它们,因此它会继续处理main的参数,在声明中看不到它们,但它们在调用中。那就是它们的来源。这就是我对这段代码的理解,对吗?

谢谢

function main() {
  return function child(num, num1) {
    console.log(num + num1);
  }
}

const result = main();
result(2, 4); // return 6

3 个答案:

答案 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);