0
window.onload = function () {
    x = '';
    myArray =  [ {a:'a', b:'b'}, {a:'c', b:'d'}, {a:x, b:''} ];
    for (i = 0; i < myArray.length; i += 1) {
        x = myArray[i].a + myArray[i].b;
    }
    alert(x);  // alerts '';
}

嗨,上面是我正在尝试做的一个例子。基本上,我希望在第二个数组元素计算 x 之后对其进行评估。我认为这称为惰性评估,但不确定......我有点新。

如何在循环中处理我的数组并每次评估 x 以便当我进行第三次迭代时,x = 'cd' 并将警报为 'cd'?

4

2 回答 2

0

我想我在你的帮助和我在评论中提到的其他线程找到了答案。只需要将 x 包装在一个函数中,然后定义一个 get 函数以应用于所有元素:

window.onload = function () {
    function get(e) {return (typeof e === 'function') ? e () : e; }
    var x = '';
    myArray = [ {a:'a', b:'b'}, {a:'c', b:'d'}, {a:function() {return x; }, b:''} ];
    for (i = 0; i < myArray.length; i += 1) {
        x = get(myArray[i].a) + get(myArray[i].b);
    }
    alert(x); // alerts 'cd';
}

x 可以是任何东西。例如 (x + 'xyz') 将提醒 'cdxyz'。因此,通过这种方式,我可以正确评估以后(需要时)想要评估的任何变量(基于当时的状态)。

这就是我需要的。:)

于 2013-09-11T18:41:21.800 回答
-1
var elements = [ { a:"a", b:"b"}, {a:"c", b:"d"}, {a:"e", b:"f"} ];
function getter(list, num) {
    var i, agg = { a: "", b: "" };
    for (i = 0; i <= num; i += 1) {
        agg.a += list[i].a;
    }
    return agg;
}

console.log(getter(elements, 0).a); // "a"
console.log(getter(elements, 1).a); // "ac"
console.log(getter(elements, 2).a); // "ace"

您可以使用闭包,这样您就无法访问这些值,例如:

var elements = [ { a:"a", b:"b"}, {a:"c", b:"d"}, {a:"e", b:"f"} ];
function make_getter(list) {
    return {
        get: function (num) {
            var i, agg = { a: "", b: "" };
            for (i = 0; i <= num; i += 1) {
                agg.a += list[i].a;
            }
            return agg;
        }
    };
}
var getter = make_getter(elements);

console.log(getter.get(0).a); // "a"
console.log(getter.get(1).a); // "ac"
console.log(getter.get(2).a); // "ace"

您可以对聚合函数进行不同的实现。

使用递归:

var elements = [ { a:"a", b:"b"}, {a:"c", b:"d"}, {a:"e", b:"f"} ];
function getter(list, num) {
    var i, agg = list[num];
    if (num > 0) {
        agg.a = getter(list, num-1).a + agg.a;
    }
    return agg;
}

console.log(getter(elements, 0).a); // "a"
console.log(getter(elements, 1).a); // "ac"
console.log(getter(elements, 2).a); // "aace" <-- note, elements are actually modified!
console.log(getter(elements, 2).a); // "aaacaace" <-- note, elements are actually modified!

旧答案

由于x不是一个对象,它的值将被复制,而不是作为引用传递。

如果您将代码更改为:

var element = { a: '', b:'' };
myArray =  [ {a:'a', b:'b'}, {a:'c', b:'d'}, element ];
for (i = 0; i < myArray.length; i += 1) {
    element.a = myArray[i].a + myArray[i].b;
}
alert(el.a);  // alerts 'cd';

你会得到"cd".


顺便说一下,这不称为惰性求值。它只是一个聚合或其他东西。

于 2013-09-11T15:17:02.460 回答