【问题标题】:Why is `with` not recommended? Is there any better or other ways to "descend" into an object's namespace?为什么不推荐使用`with`?有没有更好或其他方式“下降”到对象的命名空间?
【发布时间】:2012-09-12 04:38:31
【问题描述】:

来自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 object namespaces scope


    【解决方案1】:

    这是一个相关的答案: Are there legitimate uses for JavaScript's "with" statement?

    还有: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
    }
    

    【讨论】:

    • +1 仅用于链接到另一个问题。但是,在大多数情况下,我只会使用“简单别名”:var x = someLongNameOrExpressions; x.y = ..
    • 伙计,我是否喜欢使用立即调用的函数将复杂构造折叠成ns 的能力。别名是完美的,大多数时候... ...但如果不是,知道如何做到这一点(以及它为什么起作用)会为您想要完成的任务添加如此简单和强大的功能。
    • 当然,我同意@pst。在大多数情况下,我也会使用别名。关键是 IIFE 与 with 最接近,因为“我想在这里使用这个变量,但请让它更容易;然后我不想在这个块下访问它,所以清理部分这让它变得更容易了。”
    • 好的,但这不会阻止您修改AwkwardlyNamedObject吗? IE,一旦你的 IIFE 结束,对 obj 所做的任何修改不会丢失,而 myAwkwardlyNamedObjectToBeUsedAsANameSpaceThatIWishToModifyAndNotJustRead 保持不变?
    • @NathanWall 还有,“清理使其更容易的部分”部分在哪里适合混叠方法?当你使用完aliasvar 之后,你会直接alias = undefined; 吗?
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2020-12-15
    • 2011-02-13
    相关资源
    最近更新 更多