我一直在使用Javascript闭包来保护变量,使它们在返回的函数中是本地的,例如:
closure = function() {
var secretVar = 'Secret';
return {
"msg" : function() {
console.log(secretVar);
}
};
}();
console.log(closure.secretVar); // Undefined
closure.msg(); // Secret
Run Code Online (Sandbox Code Playgroud)
我觉得我对此有很好的把握,让我能够控制内部变量的访问方式.
我现在遇到了这个问题
closure = function() {
var secretVar = ['Secret One','Secret Two'];
return {
"del" : function(modMe) {
modMe = secretVar;
modMe.slice(1,1);
console.log(modMe);
}(secretVar),
"secretVar" : function() {
console.log(secretVar);
}
};
}();
closure.del(); // Secret One
closure.secretVar(); // Secret One
Run Code Online (Sandbox Code Playgroud)
我希望closure.del()返回Secret One,但我希望secretVar保持不变,但是,它不是.del()函数正在修改引用而不是副本,我不确定如何让它复制secretVar并修改它.
我猜它会以...的形式出现
(function(y) {
//..Body that changes y
})(secretVar)
Run Code Online (Sandbox Code Playgroud)
但是我无法让它发挥作用.有任何想法吗?
你的问题实际上与闭包无关.当你这样做时:
modMe = secretVar;
Run Code Online (Sandbox Code Playgroud)
您只是创建一个指向同一个数组的新变量.你对它做什么将反映在两个变量中,因为它们指向同一个东西.
如果要对阵列执行某种修改(同时保留原始版本),则需要先复制它:
var copied = [];
for(var i = 0; i < secretVar.length; i++){
copied.push(secretVar[i]);
}
Run Code Online (Sandbox Code Playgroud)
编辑:顺便说一句,当你说你正在使用闭包来"保护变量"时,你并没有保护它们不会被执行闭包的返回函数修改.您刚刚创建它,以便从这些函数的范围之外无法访问该变量.但是,在范围内,例如当你执行切片时,变量就在那里并且可以被该函数访问,并且因为它是一个闭包而不被"保护".
编辑2:如果您要经常复制数组,可以通过创建一个关闭函数来为您复制来消除迭代的一些烦恼:
closure = function() {
var secretVar = 'Secret';
var clone = function(){
var clonedArr = [];
var length = secretVar.length;
for(var i = 0; i < length; i++){
clonedArr.push(secretVar[i]);
}
return clonedArr;
}
return {
"msg" : function() {
var duplicate = clone();
}
};
}();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |