Clojurescript添加事件监听器

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

我从这里借来了这段代码问题是我不完全了解发生了什么。JS interop对我来说还是个谜。

  1. .addEventListener

因此,这显然是一个过程调用,但这是通用的。就像Clojurescript拿走了对象内部的所有内容,将其取出来,然后用它在“对象”上调用该方法。只要该“对象”具有“ .addEventListener”属性,它将调用此属性。那是在做什么吗?为什么不使用关键字呢?这样(:addEventListener domElement)对我来说似乎更合逻辑。

  1. js/window

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

  1. "DOMContentLoaded"

一个字符串,很熟悉。

  1. handler

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

华金

.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只是window从js名称空间获取变量。

这与您在CLJS中访问其他命名空间中的变量的方式没有什么不同。如果你(def a 1)进去(ns cljs.test)再跑cljs.test/a,那会给你的1相同的形式ns/something-in-that-ns

"DOMContentLoaded" 一个字符串,很熟悉。

\ O /

handler

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

不确定thishandlerdomready就像在JS中一样,它只是作为参数传递的高阶函数function domready (onReady) { window.addEventListener("DOMContentLoaded", onReady) }


我希望这可以帮助,如果你想尝试一下现场,了解更多一些,也许访问与JS说话潜入ClojureScript教程,也许这个检查的LT-cljs教程的部分

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章