1

考虑这段代码:

var a = {
    b: {
        c: true
    },
    d: {
        e: false
    }
};

function toggle() {
    var prop='';
    for (var i = 0; i<arguments.length; i++) {
        prop += '.' + arguments[i];
    }
    eval('a'+prop+"=!a"+prop);
}

toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);

调用toggle('b', 'c')or将分别翻转ortoggle('d', 'e')的布尔值。a.b.ca.d.e

除了邪恶(当然,它不是:))eval之外,在这里使用有什么缺点吗?eval

如果是这样,有什么替代方案?

4

1 回答 1

3

您可以使用数组表示法来访问属性,而不是点表示法。

function toggle() {
    var obj = a;
    for (var i = 0; i<arguments.length-1; i++) {
        obj = obj[arguments[i]];
    }
    obj[arguments[i]] = !obj[arguments[i]];
}
于 2013-07-29T18:54:42.920 回答