当我将它们分配给局部变量时,为什么 js 函数会失败?
Why do js functions fail when I assign them to a local variable?
在 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
函数的值来比较这些方法时,它看起来就像 "real one" —— 即 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 错误,console.log 期望 this
是console
对象。它应该按照问题日志 https://bugs.chromium.org/p/chromium/issues/detail?id=167911 中所述进行修复。
在 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
函数的值来比较这些方法时,它看起来就像 "real one" —— 即 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 错误,console.log 期望 this
是console
对象。它应该按照问题日志 https://bugs.chromium.org/p/chromium/issues/detail?id=167911 中所述进行修复。