如何避免在JavaScript函数中创建函数的浅拷贝?
我正在尝试用JavaScript编写一个符号处理计算器。我遍历了一系列符号。我的示例输入是1+2如何避免在JavaScript函数中创建函数的浅拷贝?,javascript,deep-copy,Javascript,Deep Copy,我正在尝试用JavaScript编写一个符号处理计算器。我遍历了一系列符号。我的示例输入是1+2 for <every element in the list> { ... // this case handles simple numbers var tmp = o.val; list[pos] = {type: 'expression', val: +tmp, calc: function (x) {return +tmp} }; ...
for <every element in the list> {
...
// this case handles simple numbers
var tmp = o.val;
list[pos] = {type: 'expression', val: +tmp, calc: function (x) {return +tmp} };
...
// this case handles addition
var v1 = list[pos-1].val, v2 = list[pos+1].val;
var f1 = list[pos-1].calc, f2 = list[pos+1].calc;
list[pos-1] = {type: 'expression', val: v1 + ' + ' + v2, calc: function (x) {return f1(x) + f2(x)} };
...
}
alert(list[0].val + '=' + list[0].calc(0));
用于{
...
//这个案例处理简单的数字
var tmp=o.val;
list[pos]={type:'expression',val:+tmp,calc:function(x){return+tmp}};
...
//这个箱子处理加法运算
var v1=list[pos-1].val,v2=list[pos+1].val;
变量f1=列表[pos-1]。计算,f2=列表[pos+1]。计算;
list[pos-1]={type:'expression',val:v1++'+v2,calc:function(x){return f1(x)+f2(x)};
...
}
警报(列表[0].val+'='+list[0].calc(0));
问题是它显示的是4而不是3。对第一个操作数的calc()调用不再返回1,而是返回2。我希望“calc”保存当前值,以制作f1和f2函数的深度副本。我如何做到这一点?什么是好的编程实践?尽管已经链接了正确的解释,但这是一个简单的问题解决方案:您必须打开一个新的变量范围,以确保每次“tmp”实际上都是一个新变量,而不是一次又一次的新变量:
for <every element in the list> {
(function() {
... loop body ...
)();
}
用于{
(功能(){
…环体。。。
)();
}
您的问题可以归结为:
var funcs = [];
for (var i=0; i<2; i++) {
var temp = i;
funcs.push(function() { console.log(temp) });
}
funcs[0](); // 1 - expected 0
funcs[1](); // 1
var funcs=[];
对于(var i=0;iIt不是浅拷贝与深拷贝。问题是所有这些函数共享对同一变量“tmp”的引用。有关更多示例,请参阅链接的复制问题。谢谢,这解决了我的问题。
var funcs = [];
for (var i=0; i<2; i++) {
var temp = i;
funcs.push(function(copy) { // anonymous function that copies temp
return function() { console.log(copy); }
}(temp) // call the anonymous function
);
}
funcs[0](); // 0
funcs[1](); // 1