阻止运行时评估

Prevent runtime evaluation

本文关键字:评估 运行时      更新时间:2023-09-26

假设我有这段代码

var callbacks = {};
for (var i in mylist){
callbacks[i] = { callback: function(){ myFunction( myList[i].someProperty ); }};
}

上面的代码会导致这样的列表:

myList[0].property = "zero";
myList[1].property = "one";

结果是这样的:

callbacks[0].callback // -> returns myFunction("one"); WRONG!
callbacks[1].callback // -> returns myFunction("one");

我能做些什么(for..in循环中并且不改变我在匿名函数内部访问myList[i].someProperty的事实)来确保myList[i].someProperty的值是在循环期间分配的,而不是在执行函数时分配的?

你可以在回调上设置一个key属性,然后参考this.key

var myList = {
    foo: {
        someProperty: 'oof'
    },
    bar: {
        someProperty: 'rab'
    }
};
var callbacks = {};
for (var i in myList) {
    callbacks[i] = { 
        key: i, //Add a key property
        callback: function(){ 
            myFunction( myList[this.key].someProperty ); 
            // And refer to    ^^^^^^^^
        }
    };
}
function myFunction(propertyValue) {
    console.log(propertyValue);
}
callbacks['foo'].callback(); //oof
callbacks['bar'].callback(); //rab