Clojurescript添加事件监听器

时间:2015-12-23 04:24:30

标签: clojurescript

(defn domready [handler]
  (.addEventListener js/window "DOMContentLoaded" handler))

我从here借用了这段代码。问题是我不完全理解发生了什么。 JS interop对我来说仍然有点神秘。

  1. .addEventListener
  2. 所以这显然是一个过程调用,但它是通用的。这就像Clojurescript把对象里面的所有内容拿走了,把它取出来,你用它在“对象”上调用该方法。只要该“对象”具有“.addEventListener”属性,它就会调用它。这是它在做什么?为什么不使用关键字呢?比如(:addEventListener domElement),对我来说似乎更合乎逻辑。

    1. js/window
    2. 这是什么?它是命名空间还是对象?它们是一样的吗?

      1. "DOMContentLoaded"
      2. 一个熟悉的字符串。

        1. handler
        2. 也很熟悉,但它有this的概念吗?不是说我真的会想念this

3 个答案:

答案 0 :(得分:5)

  

.addEventListener

     

所以这显然是一个程序调用,但它是善良的   通用的。这就像Clojurescript把一切都放在了里面   对象,取出它,然后用它在“对象”上调用该方法。   只要该“对象”具有“.addEventListener”属性,它就会   叫这个。这是它在做什么?为什么不使用关键字呢?   喜欢(:addEventListener domElement)对我来说更合乎逻辑。

你的心理模型大概很好。编译时的作用是将函数名称作为第一个参数的方法运行。

(.method obj ...args)转换为obj.method(...args)

这种互操作来自母语Clojure。

为什么我们有一个显式版本调用不是Clojure惯用的函数,我认为这个想法是将Clojure本机代码与Clojure语义(不变性,对CLJ数据结构友好等)明确区分开来。什么是与主机环境互操作(可变,对CLJ数据结构不友好等)。

在我看来,鉴于CLJS和主机平台的语义有多么不同,最好将这两者区分开来。对我来说,在这种情况下显式优于隐式(很容易看到代码在CLJS中查看JS代码是什么,以及什么是纯CLJS)。

  

js/window

     这是什么?它是命名空间还是对象?它们是一样的吗?

两者,js/正在访问命名空间js,这是CLJS放置JS命名空间的地方(因为只有一个和全局)。 window只是从js名称空间中获取window变量。

这与您在CLJS中访问其他命名空间中的变量的方式没有什么不同。如果您在(def a 1)(ns cljs.test)然后运行cljs.test/a,则会1。相同的表单,ns/something-in-that-ns

  

"DOMContentLoaded"   一个字符串,这是熟悉的。

<强> \ O /

  

handler

     

也很熟悉,但它有这个概念吗?不是说我真的会想念这个。

不确定thishandler的关系。它只是作为参数传递给domready的高阶函数,就像你在JS中所做的那样:function domready (onReady) { window.addEventListener("DOMContentLoaded", onReady) }

我希望这会有所帮助,如果您想要实时尝试并学习更​​多内容,可以访问Talking with JS教程中的Diving into ClojureScript,或者查看section of the lt-cljs-tutorial

答案 1 :(得分:2)

.addEventListener是对全局Javascript对象js/window的方法调用。此方法调用有两个参数:"DOMContentLoaded"handler

当您进行互操作(Java或Javascript)时,您实际上是在对象上调用方法。这里发生的事情背后有宏。在(是一个动词后,我通常将其视为函数调用(尽管它也可能是宏或特殊形式)。在进行互操作时,动词是实例之后,以及之后的参数。

如果它是直接的Javascript,它看起来像这样:

function domready(handler){
    window.addEventListener("DOMContentLoaded" handler);
}

答案 2 :(得分:1)

我只是在学习clojurescript,所以我真的不知道这是不是正确的答案,但我已经按照以下方式完成:

(defn handler [] (js/console.log "ready"))
(js/document.addEventListener  "DOMContentLoaded" handler)

然后翻译为

cljs.user.handler = (function cljs$user$handler(){
  return console.log("ready");
});
document.addEventListener("DOMContentLoaded",cljs.user.handler);

检查clojurescript如何翻译我使用KLIMPSE http://app.klipse.tech/

的代码