1

我正在尝试编写编译为此 JS 的 ReasonML:

function main(example) {
    example.foo = function() {
        console.log(this)
    }
}

这是我的理由:

let module Example = {
    type t;
    external set_foo_method : t => (t => unit [@bs.this]) => unit = "foo" [@@bs.set];
};

let main = fun example => Example.set_foo_method example (fun [@bs.this] x => {
    Js.log(x);
});

我在第二个的行和列上遇到语法错误[@bs.this]

File "/Users/maxwellheiber/dev/rerect/src/demo.re", line 6, characters 62-64:
Error: 742: <SYNTAX ERROR>

我正在关注@bs.this的 BuckleScript 文档。

this与 OCaml 相比,使用 BuckleScript 绑定到 Reason 的语法是否不同?以下具有 BuckleScript 属性的 OCaml(不是 Reason)可以正确编译为正确的 JS:

module Example = struct
    type t
    external set_foo_method : t -> (t -> unit [@bs.this]) -> unit = "foo" [@@bs.set]
end

let main example = Example.set_foo_method example (fun [@bs.this] x -> Js.log(x))

如何使用[@bs.this]Reason 中的 BuckleScript 属性来生成使用 JS 的 JS this

4

1 回答 1

3

是的,不幸的是,属性优先级等略有不同。Reason Tools(非常适合转换这样的小片段)说这就是你想要的:

module Example = {
  type t;
  external set_foo_method : t => (t => unit) [@bs.this] => unit = "foo" [@@bs.set];
};

let main example => Example.set_foo_method example ((fun x => Js.log x) [@bs.this]);

它将编译为

function main(example) {
  example.foo = (function () {
      var x = this ;
      console.log(x);
      return /* () */0;
    });
  return /* () */0;
}
于 2017-07-27T18:37:42.633 回答