【问题标题】:Function Scope with multiple nested IIFE's具有多个嵌套 IIFE 的函数范围
【发布时间】:2018-08-04 20:06:31
【问题描述】:

我在执行这个 JavaScript 练习时遇到了问题。我得到了一个函数,它定义了三个不同的变量/值对,并且在该函数中是多个嵌套的 IIFE,它们改变了这些相同的值。练习的目标是将变量的值更改为某个值。所以这是我看到的代码:

var scopeExercise = function() {
  var a = 1,
    b = 2,
    c = 3;
  result = "a: " + a + ", b: " + b + ", c: " + c;

  (function firstFunction() {
    var b = 5,
      c = 6;

    (function secondFunction() {
      var b = 8;

      (function thirdFunction() {
        var a = 7,
          c = 9;

        (function fourthFunction() {
          var a = 1,
            c = 8;
        })();
      })();
    })();
  })();

  return result;
};

console.log(scopeExercise());

他们想要 var a = 1、b = 8 和 c = 6。我仍然无法理解函数范围,因为我尝试注释掉 thirdFunction 和 FourthFunction,以免它们被调用在外部函数之前,它仍然不会改变 var a、b 和 c 的值。另外,我不明白为什么嵌套函数没有被执行,因为它们应该立即被调用。

【问题讨论】:

  • 你必须将函数 above 移动到result 否则这是不可能的。如果您希望更改 scopeExercise 范围变量,请在嵌套函数中保留 vars,否则您将创建一个新绑定。

标签: javascript scope iife


【解决方案1】:

试试这个:

var scopeExercise = function () {
  var a = 1, b = 2, c = 3;
  (function firstFunction() {
    b = 5; 
    c = 6;
    console.log('firstFunction()');
    (function secondFunction() {
      b = 8;
      console.log('secondFunction()');
      (function thirdFunction() {
        a = 7;
        c = 8;
        console.log('thirdFunction()');

        (function fourthFunction() {
          a = 1, 
          c = 6;
          console.log('fourthFunction()');
        })();
      })();
    })();
  })();
  result = "a: " + a + ", b: " + b + ", c: " + c;
  return result;
}
console.log(scopeExercise());

添加了您将看到所有功能都已执行的打印

【讨论】:

  • Hey Meir Keller 除了在每个函数上输入 var 关键字之外,您能解释一下我做错了什么吗?为什么将结果变量放在底部?另外,你为什么把 (a, b, c) 放在每个 IIFE 的末尾?
  • 我更新了我的答案。没有必要通过a,b,c。我认为因为 var 关键字是函数作用域,所以在每个函数中你都使用了 a、b 或 c 的新实例
  • 您可以在此处阅读 var 关键字与 let 关键字的比较:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多