首页 > 解决方案 > 我的关闭示例不起作用,因为我坚持

问题描述

我试图找出闭包并创建了这个简单的示例,您可以在其中使用名称调用函数 greet 并且在第一次调用之后,问候语应该包含以前的给定名称。

因此,如果您调用 greet('Andrew') 和 greet('Joseph') 我希望在控制台上看到:

Hello Andrew
Hello Andrew, Joseph 

这是我的代码: https ://codepen.io/anon/pen/pVpBdy

let greet = function(name) {
    let greeting = 'Hello ';

    let updateGreet = function() {
      greeting = greeting + ', ' + name; 
    }

    let printGreet = function() {
      console.log(greeting + name);
      updateGreet();
    }

    return printGreet();
} 

greet('Andrew');
greet('Joseph');

我看到的结果是:

Hello Andrew
Hello Joseph 

每次我调用 greet() 时,似乎都会重新初始化问候语,但我不知道为什么。

请帮助我理解这一点。

标签: javascriptclosures

解决方案


greet可以调用您的 current来创建一个自包含的对象 - 然后该对象存储名称。当前每次调用时greet,都会创建一个单独的greeting变量,封装在不同的对象中。

最简单的方法是立即执行该函数,以便所有调用都greet将引用同一个对象。

您还应该将name变量传递给updateGreet

const greet = (() => {
  let greeting = 'Hello';
  const updateGreet = function(name) {
    greeting = greeting + ', ' + name;
  }
  const printGreet = function(name) {
    console.log(greeting + ', ' + name);
    updateGreet(name);
  }
  return printGreet;
})();

greet('Andrew');
greet('Joseph');
greet('Bob');

还要确保const在声明其引用不会更改的变量时使用 - 它使代码更易于理解(对您和其他人都是如此)。


推荐阅读