在浏览器控制台中执行以下代码,输出的结果是什么,请详细解释,并举例扩展说明
function test() {
var n = 4399;
function add() {
n++;
console.log(n);
}
return { n: n, add: add };
}
var result = test();
var result2 = test();
result.add();
result.add();
console.log(result.n);
result2.add();
输出结果是 4400 4401 4399 4400 ,为什么 result.add(); 不会影响 result.n 的值
var result = test();
result 变成下面这样,这里面的 n++ ,会改变 result 的属性 n 的值吗
{
n: 4399,
add: function() {
n++;
console.log(n);
}
}
而经过 result.add(); 为什么 n 的值又会保留下来呢
闭包是指一个函数以及其捆绑的周边环境状态的引用的组合。闭包让开发者可以从内部函数访问外部函数的作用域。在这个例子中,函数 test() 返回了一个对象,该对象包含两个属性:n 和 add。n 的值为 4399,而 add 是一个函数,它将 n 的值加一并将结果打印到控制台上。在主程序中,我们调用了两次 test() 函数,并将结果分别存储在变量 result 和 result2 中。然后我们调用了两次 result.add(),并将结果打印到控制台上。最后我们打印了变量 result.n 的值,并调用了一次 result2.add()。运行结果如下:
4400
4401
4400
第一次调用 result.add() 时,变量 n 的值从 4399 变为了 4400,因此第一行输出的是 4400。第二次调用时,变量 n 的值从 4400 变为了 4401,因此第二行输出的是 4401。第三次调用时,我们使用了变量 result2.add(),但是由于它与变量 result.add() 不是同一个闭包,因此它不会影响变量 result.n 的值。因此第三行输出的是 4400。
闭包的用途有很多,其中最常见的用途是隐藏变量,避免全局污染。闭包还可以读取函数内部的变量,同时在内存中维持一个变量。还可以使用闭包来处理异步编程中的回调函数。
这个问题主要就是演示add每次掉用都会修改闭包变量让它+1,别的没啥都很简单
我们将讨论的最后一个(但并非最不重要的)用法是循环解构。让我们考虑一组员工对象。我们想要遍历数组并想要使用每个员工对象的属性值。
const User= [
{
'name': '爱分享的半夏',
'age': 16
},
{
'name': '搞前端的半夏',
'age': 18
},
{
'name': '敲代码的半夏',
'age': 20
}
];
您可以使用for-of
循环遍历User
对象,然后使用对象解构赋值语法来检索详细信息。
for(let {name, age} of employees) {
console.log(`${name} 今年${age}岁!!!`);
}