Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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_Deep Copy - Fatal编程技术网

如何避免在JavaScript函数中创建函数的浅拷贝?

如何避免在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} }; ...

我正在尝试用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} };

    ...
    // 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