2

我有一些代码:

var obj = {
    foo : true,
    bar : (function() {
        if (obj.foo) {
            return qux;
        }
    })()
};

我的问题是qux永远不会返回,因为obj执行时不存在bar,因为bar它是一个立即调用的函数。

有一个解决方案:

var obj = {
    foo : true
};

obj.bar = (function() {
    if (obj.foo) {
        return qux;
    }
})();

但我发现以前的代码更直接。有没有办法做到这一点,还是我坚持后者?

提前致谢。

4

2 回答 2

2

有没有办法做到这一点,还是我坚持后者?

假设qux它不是 IIFE 的局部变量,您可以使用它(不过,您仍然需要拆分对象声明):

var obj = {
    foo : true
};
obj.bar = obj.foo ? qux : undefined;
于 2013-10-08T20:23:09.267 回答
2

实际上有一种方法或至少有一个关于如何做到这一点的想法,但这有点荒谬。

注意:我没有实现依赖于其他延迟成员的延迟成员。

function delayedObj(o) {
    var k, v;
    for (k in o) {
        if (o.hasOwnProperty(k) && (v = o[k]).__delayedMember__) {
            o[k] = v.fn.call(o);
        }
    }
    return o;
}

function delayedMember(fn) {
    return {
        __delayedMember__: true,
        fn: fn
    };
}

然后你可以定义你的对象,如:

var obj = delayedObj({
    foo : true,
    bar : delayedMember(function () {
        return this.foo;
    })
});

console.log(obj.bar); //true
于 2013-10-08T20:51:49.907 回答