DukeScript: Как работают нативные вызовы в JavaScript?
Я пытаюсь понять, как работают вызовы "нативных методов" в DukeScript. В частности, те, в которых тело не указано в аннотации @JavascriptBody. Например:
@JavaScriptResource(value = "userEntryComponent.js")
public final class UserEntryWidget {
private UserEntryWidget() {
}
@JavaScriptBody(args = {}, body = "")
public static native void registerComponent();
}
Где определен метод registerComponent()? В нокауте есть функция javascript под названием "ko.components.register". Поэтому "registerComponent" должен быть своего рода оболочкой вокруг "ko.components.register".
Другой пример вызова нативного метода без тела приведен здесь:
@JavaScriptResource("jquery-1.11.0.min.js")
public class JQuery {
@JavaScriptBody(args = {},body="")
public static native void init();
}
Итак, что в этом случае означает "init()"? это метод Java или функция JavaScript?
1 ответ
Я полностью понимаю, почему код выглядит волшебным. Однако, если вы попытаетесь закомментировать метод init, вы должны увидеть ошибку во время усложнения javac:
COMPILATION ERROR :
-------------------------------------------------------------
JQuery.java:[10,8] At least one method needs @JavaScriptBody
annotation. Otherwise it is not guaranteed the resource will
ever be loaded
Строка ошибки - это строка с использованием @JavaScriptResource. Определение метода init действительно пустое и ничего не делает. Но после вызова он обеспечивает загрузку ресурса, определенного в @JavaScriptResource.
В случае выбивки ko.components.register определяется файлом ресурсов knockout.js. Имя метода registerComponent может быть произвольным, оно служит для запуска загрузки ресурса knockout.js.