【问题标题】:Preserve Object State when passed into queue of functions (Javascript)传递到函数队列时保留对象状态(Javascript)
【发布时间】:2021-03-01 16:49:27
【问题描述】:

一直试图找出一种方法来在推入函数时保留我的对象状态。示例代码如下:

window.queue = window.queue || [];

var some_data = {
    "object_number":1
}

queue.push(function(){console.log("1:",some_data)});

var some_data = {
    "object_number":2
}

queue.push(function(){console.log("2:",some_data)});

// Code I Cannot Change
for (var i = 0; i < queue.length; i++) {
    queue[i]();
}

队列执行的结果是:

1: {object_number: 2}
2: {object_number: 2}

您能看到当队列被解析时(我无法更改此代码 - 它由其他人控制),它如何查找“some_data”的最新版本?

知道如何保存对象传入时的状态吗?期望的结果是:

1: {object_number: 1}
2: {object_number: 2}

谢谢!

【问题讨论】:

    标签: javascript arrays function object preserve


    【解决方案1】:

    您可以使用以下变体,每次都会使用局部变量 (value) 创建 closure

    var some_data = {
        "object_number":1
    }
    
    queue.push(((value) => () => console.log("1:",value))(some_data));
    
    var some_data = {
        "object_number":2
    }
    
    queue.push(((value) => () => console.log("2:",value))(some_data));
    

    在这种情况下,覆盖some_data 后,value 不会改变,因为它是一个单独的变量。但请注意,更改some_data 的内容也会更改value 的内容(那么可能需要在每个push 之前复制some_data):

    var some_data = {
        "object_number":1
    }
    
    queue.push(((value) => () => console.log("1:",value))(some_data));
    
    var some_data = {
        "object_number":2
    }
    
    queue.push(((value) => () => console.log("2:",value))(some_data));
    
    some_data.object_number = 1;
    
    for (var i = 0; i < queue.length; i++) {
        queue[i]();
    }
    
    // 1: { object_number: 1 }
    // 2: { object_number: 1 }
    

    【讨论】:

    • 非常感谢@z1ne2wo!我会相应地更新并回复结果
    • 在@z1new2wo 上发现——我还在为其他用户发布 ES6 与 ES5 符号。 ES6queue.push(((value) =&gt; () =&gt; console.log("1:",value))(some_data));ES5queue.push(function (value) { return function () { return console.log("1:", value); }; }(some_data));
    猜你喜欢
    • 2017-08-31
    • 2013-01-05
    • 1970-01-01
    • 2023-02-05
    • 2011-12-07
    • 2012-05-04
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多