【问题标题】:How to use "with" construction in javascript? [duplicate]如何在javascript中使用“with”构造? [复制]
【发布时间】:2014-02-25 10:29:09
【问题描述】:

我有这个代码:

var home = {}
home.table={}
home.table.width = 100
home.table.length = 200
home.table.weight = 20
home.table.material = "wood"
home.table.color = "brown"

我怎样才能使用结构with (object) {code} right 来获得这样的东西?

var home = {}
with (home) {
table = {}
table.width = 100
table.length = 200
table.weight = 20
table.material = "wood"
table.color = "brown"
}

【问题讨论】:

  • 您是否希望在本地范围内为变量起别名?函数可以很好地解决这个问题。
  • 我很快就会说:不要在 javascript 中使用 WITH

标签: javascript


【解决方案1】:

首先,您应该阅读此MDN page。从该页面引用:

不建议使用 with 语句,因为它可能是来源 令人困惑的错误和兼容性问题。见“歧义骗局” 有关详细信息,请参见下面的“说明”部分。

还有:

不推荐使用 with,并且在 ECMAScript 5 strict 中被禁止 模式。推荐的替代方法是分配对象 您要访问临时变量的属性。


其次,如果我正在编写您的代码,我会这样做:

var home = {};
home.table = {
    width: 100,
    length: 200,
    weight: 20,
    material: 20,
    color: "brown"
};

或者,整个事情甚至可以在一个 JS 文字中完成:

var home = {
  table: {
    width: 100,
    length: 200,
    weight: 20,
    material: 20,
    color: "brown"
  }
};

这是一个使用临时变量的示例(如 MDN 推荐的 with 的替代品)将是这样的 - 尽管在这种情况下我更喜欢上述格式:

var home = {};
home.table = {};
var table = home.table;
table.width = 100;
table.length = 200;
table.weight = 20;
table.material = 20;
table.color = "brown";

【讨论】:

  • 为什么不var home = { table : { width : 100, length : 200 } };
  • @OrangeFox - 临时变量示例添加到我的答案中,但在这种情况下,我更喜欢它上面的那个。
  • @Tibos - 如果你想要最简洁,你当然可以将这样的定义嵌套在一个 JS 文字中。有时这是合适的,有时它不那么可读 - 这取决于此处未提供的上下文。我的目的是回答有关使用 with 的替代方法的问题,这仅与表对象的声明有关。
【解决方案2】:

您不能在不指定对象的情况下在对象中创建属性。先创建属性,然后你可以在with 块中使用它:

var home = {};
home.table = {};
with(home) {
    table.width = 100;
    table.length = 200;
    table.weight = 20;
    table.material = "wood";
    table.color = "brown";
}

不过,不推荐使用with。它会造成混淆范围,并且在 HTML5 严格模式下是不允许的。

您可以使用对象字面量以更少的代码创建相同的对象:

var home = { table: { width: 100, length: 200, weight: 20, material: "wood", color: "brown" } };

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 2012-07-28
    • 2016-03-18
    • 2015-07-11
    • 2020-03-19
    • 2013-09-04
    • 2011-03-22
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多