在Javascript中没有正确调用闭包中的嵌套函数

时间:2014-09-21 18:58:23

标签: javascript scope closures

我是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));

请帮助我理解我做错了什么 - 我已经去过很多网站了解关闭和范围,但似乎没有什么能解释清楚。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

当您调用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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在此示例中非常容易

如果你有这种类型 在 ES6

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

你有两种方法来调用每个函数,首先,我想调用 First 函数 以这种方式f()(),然后我想调用第二函数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()()();