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 '';
}

こんにちは、上記は私がやろうとしていることの例です。基本的に、2番目の配列要素が計算した後に x を評価したいと思います。これは遅延評価と呼ばれていると思いますが、よくわかりません...私はやや初心者です。

ループ内で配列を処理し、x を毎回評価して、3 回目の繰り返しに到達すると x = 'cd' となり、'cd' としてアラートを出すにはどうすればよいですか?

4

2 に答える 2

-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 に答える