【问题标题】:JS closures and scope chain clarification needed需要 JS 闭包和范围链澄清
【发布时间】:2019-01-13 12:05:09
【问题描述】:

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

在下面的代码中,内部子函数查找 num 和 num1 的值。接下来,解释器沿着作用域链向上搜索它们。它在 main() 中查找并且没有看到它们,因此它继续到 main 的参数,在声明中没有看到它们,但它们在调用中。这就是它从那里得到它们的地方。这就是我对这段代码如何工作的理解,对吗?

谢谢

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

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

【问题讨论】:

  • 这里没有闭包。 main 中没有在 child 中使用的变量。

标签: javascript function scope closures


【解决方案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);

【讨论】:

  • 感谢您的回答。控制台.log(innerFn);不是我所期望的!
【解决方案2】:

以下之间没有实际区别(至少在您的问题范围内):

function name (foo) {

}

和

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

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


所以它不会在主体中寻找变量声明,如果没有找到,则在参数中寻找一个。它只是在函数范围内寻找一个变量。

【讨论】:

  • 感谢您的回复,但在上面的示例中,变量没有在函数中声明或作为参数传递。
  • @ShaneG — function child(num, num1)
  • @ShaneG — result(2, 4);
【解决方案3】:

您的参数保持在您的函数范围内。当 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();

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2014-04-09
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多