什么是JS中编译等价的命名参数?

时间:2014-07-15 06:18:26

标签: dart

如果我说的话

void simple({foo: true, bar: false}){
  print('$foo $bar');
}

是否编译为

function simple(foo, bar) ...

或它是否转动命名参数,因此它只接受一个对象作为包含object.foo和object.bar的参数。我查看了它生成的dart.js,但看起来它正在从javascript编译程序的AST,这对我来说有些疯狂。

1 个答案:

答案 0 :(得分:4)

经过一番研究,我发现,正如Günter Zöchbauer所说,我们已经做了很多优化。

但是,由于这种优化,编译器避免(正如我在实验中看到的那样)在可能的情况下传递对象。我认为是为了表现,但我不确定

因此,在大多数情况下,Named argment会直接传递,并在编译期间解析。

为了测试这个,我写了一个虚拟代码:

<强> dummy.dart

import 'dart:math';

double calcFunc({int a, int b}) {
  return (a * b / (a+b)) * (new Random().nextInt(100)) ;
}

String myFunc({int a: 0, int b: 0}) {
  return "Numbers : ${a + calcFunc(a: a, b : b) * (new Random().nextInt(100))}";
}

void main() {
  print("Func call: ${myFunc(a: 42, b: 24)}");
  print("Func 2nd call: ${myFunc(a: 21)}");
}

和代码的结果JS(没有生成所有东西)

<强> dummy.dart.js

["", "main.dart", , F, {
  "^": "",
  myFunc: function(a, b) {
    var t1 = C.C__JSRandom.nextInt$1(100);
    return "Numbers : " + (a + a * b / (a + b) * t1 * C.C__JSRandom.nextInt$1(100));
  },
  main: function() {
    P.print("Func call: " + F.myFunc(42, 24));
    P.print("Func 2nd call: " + F.myFunc(21, 0));
  }
},
1],
]);

就像你在这里一样,参数中没有传递任何对象,但是它们被直接替换。