【问题标题】:Nested functions in closure not being called properly in Javascript在Javascript中没有正确调用闭包中的嵌套函数
【发布时间】:2014-11-15 18:00:53
【问题描述】:

我是 Javascript 新手,正在学习闭包和嵌套范围。

提示要求这样做: 编写一个具有三个嵌套函数的函数,每个函数以一个数字作为参数。最里面的函数应该返回所有三个数字的总和。

这是我想出来的:

var outMost = function (num1) {
var x = num1;
var innerMost = function (num2) {
    var y = num2;
    var innerInnerMost = function (num3) {
        console.log(x + y + num3);
    }
    return innerInnerMost;
}
return innerMost;
}

var firstNum = outMost(1);
firstNum(2);
firstNum((3));

请帮助我理解我做错了什么——我已经在许多网站上了解了闭包和范围,但似乎没有什么能很好地解释它。谢谢你的帮助。

【问题讨论】:

  • 请注意 xy 变量不是必需的,num1num2 命名参数是相同范围内的变量,您可以直接用于求和。

标签: javascript scope closures


【解决方案1】:

非常简单看看这个例子

如果你有这种类型 ES6

  let f = () => {
  return () => {
    console.log('First function called');
    return () => {
      console.log('Second function called');
    }
  }
}

你有两种方式来调用每个函数,首先我要调用First函数 这样f()() 然后我想调用Second函数f()()()。 首先,您将在控制台中看到

调用的第一个函数

然后

调用第二个函数

还有另一种使用这种技术的方式

let f1 = f();
let f2 = f1();

你会看到

调用的第一个函数

如果要调用第二个函数

let f1 = f();
let f2 = f1();
let f3 = f2();

然后你会看到

调用第二个函数

如果您想将此代码更改为 ES5

var f = function() {
  return function() {
    console.log('First function');
    return function(){
      console.log('Second function');
    }
  }
}

两种调用方式

var f1 = f();
var f2 = f1();
var f3 = f2();

f()()();

【讨论】:

    【解决方案2】:
    function firstFunc(x){
        return function secondFunc(y){
                return function thirdFunc(z){
                        console.log(x+y+z);
                    }
            }
    }
    

    来电:

    var ff = firstFunc(1);
    
    var sf = ff(2);
    
    sf(3);
    

    【讨论】:

      【解决方案3】:

      当您调用firstNum(2) 时,您没有捕捉到返回值(这是一个函数)。如果我在 Node.js REPL 中运行你的代码,它看起来是这样的:

      > var firstNum = outMost(1);
      undefined
      > firstNum(2);
      [Function]
      > firstNum((3));
      [Function]
      

      最后试试这个:

      var firstNum = outMost(1);
      var secondNum = firstNum(2);
      secondNum(3);
      

      这是它在 Node.js REPL 中的样子:

      > var firstNum = outMost(1);
      undefined
      > var secondNum = firstNum(2);
      undefined
      > secondNum(3);
      6
      undefined
      

      请注意,分配的计算结果为 undefined。另外,由于innerInnerMost 没有return 任何东西,所以最后有一个隐含的return undefined

      【讨论】:

      • 非常感谢哈利——现在更有意义了。
      • 我做到了,请您给我的问题提几点意见。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2015-06-15
      • 2022-01-10
      • 2015-03-18
      • 2017-02-21
      • 2021-09-03
      • 2012-02-07
      相关资源
      最近更新 更多