Javascript 重新声明的变量中的持久化数据
即使重新声明变量,第一个Javascript 重新声明的变量中的持久化数据,javascript,Javascript,即使重新声明变量,第一个foo的数据如何持久化 更详细地说,尽管重新声明了对象,但第一个条属性仍然增加。每个按钮都有自己的独立计数器: var foo = { bar: 1, bindClick: function(){ var that = this; $('#first').on('click', function(){ console.log(that.bar++); }); } }; foo
foo
的数据如何持久化
更详细地说,尽管重新声明了对象,但第一个条
属性仍然增加。每个按钮都有自己的独立计数器:
var foo = {
bar: 1,
bindClick: function(){
var that = this;
$('#first').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
var foo = {
bar: 1,
bindClick: function(){
var that = this;
$('#second').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
使用自动执行函数创建作用域。引用的foo内部与外部不同,因此即使它们具有相同的名称,也不会被覆盖
var foo = {
bar: 1,
bindClick: function(){
var that = this;
$('#first').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
(function() {
var foo = {
bar: 1,
bindClick: function() {
var that = this;
$('#second').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
}())
该行保持对原始对象的引用;您实例化的第一个。即使该变量名被重新用于其他用途,因为事件侦听器和闭包仍然存在,所以它仍然在某个地方被引用
(不提供变更建议,因为你只是对理由感到好奇。如果你有特别想要的行为,请随意添加更多的问题)从第二个foo中去掉
var
。重新声明实际上不会“擦除”第一个对象。本质上,我认为Javascript并没有完全覆盖foo
变量的值,它只是覆盖了差异,即bindClick定义。foo
对象仍然指向与bar
相同的引用,因为该值尚未替换为对新foo
的bar
属性的引用
var foo = {
bar: 1,
bindClick: function(){
var that = this;
$('#first').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
foo = {
bar: 1,
bindClick: function(){
var that = this;
$('#second').on('click', function(){
console.log(that.bar++);
});
}
};
foo.bindClick();
您正在尝试创建同一对象的两个实例吗?如果是这样,最好采取以下措施:
var foo = function() {
this.bar = 0;
this.bindClick = function() {
this.bar++;
}
}
var first = new foo();
first.bindClick();
由于原始的
foo
仍被引用,因此不会被销毁。你必须隐式地删除foo.bar@maufactor所以你是说这里有两个并行的foo
s?这是它的“自然栖息地”中的代码,还是你把它拉出来试图说明你的情况?无论如何,你为什么要在相同的范围内声明一个变量?根据我的两个问题,在同一范围内重新声明变量是很奇怪的。我问这段代码是否在它的“自然栖息地”的原因是为了了解这段代码的真正意图是什么,以及在相同的范围内重新定义变量是否真的有必要。可能不是。我不是在要求修理。我想解释一下这种行为。而且,第一个foo
在你的生活中仍然可以访问,所以这没有什么区别。你问如何持久。最快的解决方案根本不是覆盖。我再看一次。因为没有得到你一直在寻找但从未问过的答案,我投了反对票。真正地也许你应该看看@devconcept,我把你推了回来。同样的事情也发生在我身上。不知道谁投了反对票。遗憾的是,如果问得恰当,这可能是一个好问题。我还取消了对你答案的投票。我花了半个小时才知道真正需要做什么,这就是我想知道的。非常感谢。如果你因为某人没有给你想要的答案而投否决票,你可能应该澄清你在帖子中“只是好奇”。
var foo = function() {
this.bar = 0;
this.bindClick = function() {
this.bar++;
}
}
var first = new foo();
first.bindClick();