Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有多个嵌套IIFE的函数范围';s_Javascript_Scope_Iife - Fatal编程技术网

Javascript 具有多个嵌套IIFE的函数范围';s

Javascript 具有多个嵌套IIFE的函数范围';s,javascript,scope,iife,Javascript,Scope,Iife,我在这个JavaScript练习中遇到了问题。我得到了一个函数,它定义了三个不同的变量/值对,在这个函数中有多个嵌套的IIFE,它们改变了相同的值。练习的目标是将变量的值更改为某个值。下面是我收到的代码: var scopeExercise = function() { var a = 1, b = 2, c = 3; result = "a: " + a + ", b: " + b + ", c: " + c; (function firstFunction()

我在这个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());
他们希望变量a=1,b=8,c=6。我仍然无法理解函数的作用域,因为我已经尝试注释第三个函数和第四个函数,这样它们就不会在外部函数之前被调用,也不会改变var a、b和c的值。另外,我不明白为什么嵌套函数没有被执行,因为它们应该被立即调用。

试试这个:

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());

添加了打印,您将看到所有函数都已执行

您必须将赋值上方的函数移动到
结果
,否则这是不可能的。如果您想更改
scopeExercise
scope变量,请在嵌套函数中去掉
var
s,否则您将创建一个新绑定。嘿,Meir Keller,除了在每个函数上输入var关键字之外,您能解释一下我做错了什么吗?为什么要将结果变量放在底部?还有,你为什么在每个IIFE的末尾加上(a,b,c)?我更新了我的答案。没有必要通过a、b、c。我认为,因为var关键字是函数作用域,所以在您使用的每个函数中,都有一个新的a、b或cYou实例,您可以在这里阅读关于var关键字的内容,而不是let关键字: