为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间

Why is `with` not recommended? Is there any better or other ways to "descend" into an object's namespace?

本文关键字:方法 其他 命名空间 下降 对象 with 为什么不 是否 更好      更新时间:2023-09-26

来自MDN:

不建议使用 with,在 ECMAScript 5 严格模式下是禁止的。建议的替代方法是将要访问其属性的对象分配给临时变量。

这似乎是一个很棒/有用/方便的功能。为什么不高兴?还有什么其他方法可以达到这种效果?我不想去:

veryLongNS.y = veryLongNS.myFunc(veryLongNS.x);
veryLongNS.z = 6;
veryLongNS.otherFunc();
veryLongNS.a = {
    a:1,
    b:2,
    c:veryLongNS.processThree(3)
};

这是一个相关的答案:JavaScript的"with"语句是否有合法用途?

另外:http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

以下作为替代方案怎么样?

(function(obj) {
    obj.y = obj.myFunc(obj.x);
    obj.z = 6;
    obj.otherFunc();
    obj.a = {a:1,b:2,c:obj.processThree(3)};
})(myAwkwardlyNamedObjectToBeUsedAsANameSpaceThatIWishToModifyAndNotJustRead);

编辑:为了清楚和后代,这也是可能的(在大多数情况下,比上述更可取 - 我不建议在全局范围内这样做,但我不建议在全局范围内做任何事情(:

function someFunction() {
    // in some function
    var obj = myAwkwardlyNamedObjectToBeUsedAsANameSpaceThatIWishToModifyAndNotJustRead;
    obj.y = obj.myFunc(obj.x);
    obj.z = 6;
    obj.otherFunc();
    obj.a = {a:1,b:2,c:obj.processThree(3)};
    // ... any other stuff in the function
}