clojurescript – 为什么当我将它们分配给局部变量时,js函数会失败?

在clojurescript 1.9.89和Chrome 50.0.2661.102中,我可以创建一个日志语句,如:

(js/console.log "works")

但我不能创建一个像:

(def brokenlog js/console.log)
(brokenlog "but not here")

--> #object[TypeError TypeError: Illegal invocation]

当我尝试通过打印我自己的brokenlog函数的值来比较这些方法时,它看起来就像“真实的” – 也就是说,brokenlog和js / console.log都为我评估:

#object[log "function log() { [native code] }"]

同样,我看到这种行为:

cljs.user=> (js/document.querySelector "body")
#object[HTMLBodyElement [object HTMLBodyElement]]
cljs.user=> (def l js/document.querySelector)
#'cljs.user/l
cljs.user=> (l "body")
#object[TypeError TypeError: Illegal invocation]
nil

升级到Chrome 52会修复console.log行为,但不会修复document.querySelector行为.

所以我有两个问题:

1.我错过了什么

2.我应该阅读哪些官方文档可以解释它?

谢谢!

最佳答案 您使用的是哪个浏览器和clojurescript版本?

如果下面的代码显示为nil,则以下代码应该适用于您的浏览器.

.as-console-wrapper .as-console {
  display: none;
}
<pre><code class="language-klipse">
(js/console.log "Work!")
(def brokenlog js/console.log)
(brokenlog "Work again!")
; two line should be seen in your browser log
</code></pre>
<script>
    window.klipse_settings = {
        selector: '.language-klipse', // css selector for the html elements you want to klipsify
    };
</script>
<script src="http://app.klipse.tech/plugin/js/klipse_plugin.js?"></script>
<link href="http://app.klipse.tech/css/codemirror.css" rel="stylesheet"/>

编辑

这是clojurescript

(ns hello-world.core)
(def mylog js/console.log)
(mylog "Hello")

编译成javascript

hello_world.core.mylog = console.log;
hello_world.core.mylog.call(null,"Hello");

console.log.call(null,….)触发chrome bug,console.log期望这是控制台对象.它应该按照问题日志https://bugs.chromium.org/p/chromium/issues/detail?id=167911中的说明进行修复.

点赞