javascript - 如何从另一个函数返回一个函数然后调用它?

标签 javascript closures

有人可以解释为什么下面的代码会失败吗?
我如何使用闭包访问 zip 函数?我想让它打印出 value1

function foo() {
    var bar;

    function zip() {
        var quux = 'value1';
        bar = true;    
        console.log(quux);
    }

    quux = 'value2';
    console.log(quux);
    return zip;      
}

foo();

var a = zip;

a();

当前显示zip is not defined

最佳答案

您可以使用:

foo()()

或与变量赋值相同:

var a = foo();
a();

请注意,它将同时输出 value2value1。

这是如何运作的?

为了更容易理解所提供的代码,请考虑以下与您的代码产生相同结果的示例:

function foo() {
  var bar;
  quux = 'value2';
  console.log(quux);

  return function() {
    var quux = 'value1';
    bar = true;

    console.log(quux);
  };
}

var a = foo(); // executes code, returns function and stores it in a variable
a(); // executes function, stored in a variable

我想,现在这段代码更容易理解 - 它执行一些代码,返回一个函数,您稍后会调用它。

现在,考虑另一个例子:

function foo() {
  var bar;
  quux = 'value2';
  console.log(quux);

  var zip = function() {
    var quux = 'value1';
    bar = true;

    console.log(quux);
  };

  return zip;
}

var a = foo(); // executes code, returns function and stores it in a variable
a(); // executes function, stored in a variable     

这段代码做同样的事情,但它在作为结果返回之前将一个函数存储在一个变量中。您在示例中提供的代码与上一个示例几乎没有区别,除了函数声明:

这些几乎是等价的(why almost?):

var zip = function() {
};

function zip() {
}

关于javascript - 如何从另一个函数返回一个函数然后调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33497869/

相关文章:

swift - 为什么 Swift 3 需要 @escaping 注解?

Python 闭包,默认参数不等于使用 functools.partial 的解决方案?

javascript - Next.js 在页面路由时保持滚动位置

javascript - 如果 Web 服务器可以,为什么还要编写应用程序?

javascript - 无法读取未定义的属性(读取 'digest' ) Angular + ipfs 在 https 上构建

javascript - 我如何在 '\' 的字符串中替换所有 '/' 和 '-' 字符,在 javascript 中

python - pygtk : free variable referenced before assignment in enclosing scope

swift - 使用参数在其他 View Controller 上设置闭包

javascript - 跨同一域但使用不同端口的页面的本地存储

Javascript:独特的内部函数 "remembers"外部函数第一次调用参数?