Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重新声明的变量中的持久化数据_Javascript - Fatal编程技术网

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();