是否有JS"范围块"与对象?

时间:2017-11-18 20:41:25

标签: javascript

假设我有一个对象:

public class AutoListSort implements Comparator<Auto> {
    @Override
    public int compare(Auto person1, Auto person2) {

        return person1.getGodiste().compareTo(person2.getGodiste());

    }
}

JS中的语法是否支持&#34;范围块&#34;或类似的东西,比如伪代码,这样我可以调用函数var Root = { A: { AA: ..., AB: ..., AC: function() {} } }; 或获取值AC()而不必冗余地写AB

像这样

Root.A

表示类似这样的内容

(Root.A) {
    AC();
    console.log(AB);
}

3 个答案:

答案 0 :(得分:1)

目前,没有推荐的方法来实现这一目标。我们有with语句,它完全符合您的要求,但它带有性能成本,strict mode明确禁止(解释为here)。

如果由于某种原因您绝对需要此功能,您可以使用with,如下所示:

var Root = {
    A: {
        AA: 5,
        AB: 6,
        AC: function() {return 4;}
    }
};

with(Root.A) {

    console.log(AB);
    console.log(AA);

    console.log( AC() );
}

编辑:

执行此操作的另一种方法(也是未经推荐的)是将Root.A添加到全局窗口范围,如下所示:

var Root = {
    A: {
        AA: 5,
        AB: 6,
        AC: function() {return 3;}
    }
};

// Extend window with Root.A's objects
window = Object.assign(window, Root.A);

console.log(AA);
console.log(AB);
console.log( AC() );

与上述解决方案的权衡是你正在污染全球范围(一个非常糟糕的主意)。

最后,如果您提前知道Root.A的所有字段,则只需将字段分配给当前范围中具有相同名称的变量:

var Root = {
    A: {
        AA: 5,
        AB: 6,
        AC: function() {return 3;}
    }
};

(function() {
  
  var AA = Root.A.AA;
  var AB = Root.A.AB;
  var AC = Root.A.AC;
  
  console.log(AA);
  console.log(AB);
  console.log( AC() );
  
})();

最后一种方式是首选方式,但它假设您提前了解所有字段名称。

答案 1 :(得分:1)

从某些版本(我认为是ES6)你可以使用解构赋值并写下这样的东西:

const {AA, AB, AC} = Root.A;
AC();
console.log(AB);

如果有帮助的话。

答案 2 :(得分:0)

函数内部的

this引用外部对象,如果这是您要查找的内容。

&#13;
&#13;
var Root = {
    A: {
        AA: 1234,
        AB: 'AB text',
        AC: function() {
           // this ==== Root
           return this.AB;
        }
    }
};

console.log(Root.A.AC())
&#13;
&#13;
&#13;