javascript闭包如何与对象一起使用

时间:2018-10-17 05:23:31

标签: javascript closures

function add(_abc) {
    return _abc.b = 10;
}

var abc = { a: 5 };

(function(abc){
    setTimeout(function(){
        console.log(`abc from inside function ${JSON.stringify(abc)}`);
    }, 3000);
})(abc);

add(abc);

console.log(`abc from outside function ${JSON.stringify(abc)}`);

产生输出

abc from outside function {"a":5,"b":10} 
abc from inside function {"a":5,"b":10} 

我想显示内部函数的控制台输出,而没有b

1 个答案:

答案 0 :(得分:1)

您可以捕获abc的字符串化版本作为闭包而不是引用对象:

function add(_abc) {
  return _abc.b = 10;
}

var abc = { a: 5 };

(function(abc) {
  let abc_str = JSON.stringify(abc)
  setTimeout(function() {
    console.log(`abc from inside function ${abc_str}`);
  }, 3000);
})(abc);

add(abc);

console.log(`abc from outside function ${JSON.stringify(abc)}`);

闭包绑定名称,它们不冻结对象。因此,没有一种方法可以在不创建副本的情况下获得闭包中对象状态的快照,而这基本上就是通过将其字符串化来实现的。