【问题标题】:problems with closure in JSJS中的闭包问题
【发布时间】:2017-11-09 01:30:21
【问题描述】:

当我有 3 级作用域时,我在理解闭包时遇到了问题

https://jsfiddle.net/Ar2zee/wLy8rkyL/1/

如何在 level3 函数中访问参数“g”,

var a = 10;

function level1(b) {
  var c = 1;

  function level2(f) {
    var d = 2;

    function level3(g) {
      return a + b + c + d + f + g;
    }
    return level3()
  }
  return level2;
}
var temp = level1(10);
var temp2 = temp(10);
var temp3 = temp2(10);
console.log(temp3(10)); // or level(10)();  without variable

谢谢!

【问题讨论】:

  • 我给了 JSfiddle 的链接
  • “无法访问参数g”是什么意思?您没有使用参数调用 level3 函数。
  • 查看您的控制台错误
  • 我想让 g 例如 10 并解决这个问题,我可以在哪里以及如何访问变量 g

标签: javascript function closures scopes


【解决方案1】:

Line:1 调用level1 fn 并取回存储在别名temp 中的fn level2
Line:2 调用temp fn 并取回存储在别名temp2 中的fn level3
Line:3 现在在调用temp2 fn 时执行 fn level3 获取加法运算的结果。

所以temp3 不是函数而是值。

var a = 10;

function level1(b) {
  var c = 1;

  function level2(f) {
    var d = 2;

    function level3(g) {
      return a + b + c + d + f + g;
    }
    return level3;
  }
  return level2;
}
var temp = level1(10);
var temp2 = temp(10);
var temp3 = temp2(10);
console.log(temp3); // or level(10)();  without variable

【讨论】:

  • 非常感谢。内部函数从不使用带括号的返回,只是函数的名称,仅此而已,或者在某些情况下我可以使用括号?
  • 这真的取决于你想要实现什么,如果你想要一个函数,那么不要调用它,如果你想要结果,然后调用它(带括号)。
【解决方案2】:

只需替换

Return level3()

Return level3

【讨论】:

  • 如果我想动态地在函数中传递数字并在将来更改它,那有什么理由呢???
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多