javascript闭包和对象参考
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript闭包和对象参考,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1621字,纯文字阅读大概需要3分钟。
内容图文
![javascript闭包和对象参考](/upload/InfoBanner/zyjiaocheng/693/c152f5547a00496697335cec4b473671.jpg)
我的情况有点晦涩.主要是因为我认为我已经掌握了关闭方法.所以基本上我想要的是将集合重置为默认值.因此,可以说我有一个具有构造函数和对象数组参数的集合.
var c = new collection([{x},{y},{z}]);
然后收集会定期更新.因为我没有在某个地方保留数组的初始值,所以一段时间后我想重置为初始值.
现在我不问如何实现这一点,关于闭包本身的问题可能有多种方式.请进一步阅读
因此,我可能会想到使用闭包捕获此初始值的方式,因此它看起来可能像这样.
c.on('reset',(function(arr){
return function(){
c.internalarray = arr;
}
})(c.internalarray))
所以它似乎不起作用,因为引用被作为参数传递了,集合会更新可能被捕获的arr,并且它的更新最终也总是对
arr === c.internalarray;
我可能以为可以通过数组的克隆,但是重点不在于某处只是通过分配保持全局变量来创建数据副本.
所以我的问题是我做错了.我认为以某种方式隐式地用javascript引擎创建了陷阱变量/对象的副本.我不必跟踪它们.
解决方法:
在javascript中,复合数据类型通过引用传递,因此c.internalarray和arr都引用相同的值.实际上,您使用的是正确的方法,但是您必须先复制数组,然后再将其传递给立即调用的函数.例如 :
c.on('reset', function (arr) {
return function () {
c.internalarray = arr;
}
}(c.internalarray.slice()));
也就是说,该技术不会创建深层副本,这意味着数组中包含的复合类型仍然可以从立即调用的函数外部进行更改.在下面的代码中,我试图简化这种情况,以使事情更容易理解,希望:
变量a指向包含两个元素的数组:
var a = [
1, // primitive value
{} // composite value
];
让我们制作a的浅表副本并将其分配给b:
var b = a.slice();
// a -> [1, {}]
// b -> [1, {}]
// b === a -> false
从a删除第一个元素对b无效:
a.shift();
// a -> [{}]
// b -> [1, {}]
但是修改a中包含的对象也会影响b:
a[0].k = 'value';
// a -> [{ k: "value" }]
// b -> [1, { k: "value" }]
// a[0] === b[1] -> true
内容总结
以上是互联网集市为您收集整理的javascript闭包和对象参考全部内容,希望文章能够帮你解决javascript闭包和对象参考所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。