javascript - 我的关闭示例不起作用,因为我坚持
问题描述
我试图找出闭包并创建了这个简单的示例,您可以在其中使用名称调用函数 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() 时,似乎都会重新初始化问候语,但我不知道为什么。
请帮助我理解这一点。
解决方案
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
在声明其引用不会更改的变量时使用 - 它使代码更易于理解(对您和其他人都是如此)。
推荐阅读
- build.gradle - 无法解析 com.squareup.sqldelight:native-driver:1.3.0
- mysql - 如何在 vitess v6.0.20-20200508 中设置 sql_mode
- javascript - 我应该在哪里获取异步数据?
- javascript - 使用 componentDidMount 和 componentWillUnmount 在 React 中添加和删除事件监听器
- go - Go gin 获取请求正文 json
- java - Swing Timer 调用动作执行了两次
- google-cloud-dataflow - 问题:BigQueryIO 为每个输入行创建一个文件,是否正确?
- postman - 我应该将生成的邮递员文档保存在哪里?
- ios - 有什么方法可以从我的网站取消 iOS InAppPurchase?
- python - 使用 xpath 从 span 中提取值