首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >出口防御方法

出口防御方法
EN

Stack Overflow用户
提问于 2013-11-25 10:32:50
回答 2查看 449关注 0票数 1

我试图在javascript中创建对象并调用一个方法。方法名称被咀嚼。我试着没有运气地使用externs.js。

代码语言:javascript
运行
复制
(deftype ^:export SceneMain []
  Object
  (handleShow [_]
    (display-categories)))

;; should be used in javascript as:

var s = new SceneMain();
s.handleShow();

;; Uncaught TypeError: Object [object Object] has no method 'handleShow'
;; Uncaught TypeError: Object #<dg> has no method 'handleShow'

这是我的externs.js

代码语言:javascript
运行
复制
var SceneMain = {};
SceneMain.handleShow = function() {};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 13:33:36

我使用exportSymbol:

代码语言:javascript
运行
复制
(goog/exportSymbol "SceneMain" SceneMain)
(goog/exportSymbol "SceneMain.prototype.handleShow" SceneMain.prototype.handleShow)

它甚至适用于高级优化:

代码语言:javascript
运行
复制
ca("SceneMain",mg);
ca("SceneMain.prototype.handleShow",SceneMain.prototype.Cb);
票数 2
EN

Stack Overflow用户

发布于 2013-11-25 11:09:30

不完全确定你想要达到什么目的。

当您使用没有用谷歌闭包编译器编译的Clojurescript的外部javascript库时,externs.js是有用的,主要原因是当使用超出空白的优化时,编译器不会破坏外部库。

例如,MixPanel Javascript api。

假设您有以下使用该api的cljs代码:

代码语言:javascript
运行
复制
(defn track 
   ([name data]
      (.track js/mixpanel name 
             (clj->js data)))
   ([name]
      (.track js/mixpanel name)))

您需要在externs.js中定义

代码语言:javascript
运行
复制
 var mixpanel = {};
 mixpanel.track = function() {};

以避免闭包编译器破坏对该对象/函数的调用。

现在,如果您想从Javascript调用Clojurescript函数,可以使用^:export

说你有:

代码语言:javascript
运行
复制
(ns test.cljs)

(defn ^:export testfn
   []
   (.log js/console "test"))

从javascript您可以:

代码语言:javascript
运行
复制
 test.cljs.testfn()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20189860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档