2024年Clojure状态调查!分享您的想法。

欢迎!有关如何使用本站的更多信息,请参见关于页面。

+1
ClojureScript
不确定这是否是错误还是预期行为,但这样做


(defn test-fn []
  (let [href     js/location.href
        location "123"]
    href))


被编译成这样(不是在高级模式下)


cognician.chat.ui.pages.insights.test_fn = (function cognician$chat$ui$pages$insights$test_fn(){
var href = location.href;
var location = "123";
return href;
});


并且局部{{location}}变量会遮蔽全局我在{{location.href}}中要访问的变量。

这类问题是预期之中的,在JS中应引起注意并尝试解决问题,但在CLJS中却非常令人困惑,因为没有暗示我在哪里做错了以及为什么代码会失败。我记得ClojureScript的一个目标就是修复JS语义,也许有办法解决这类问题?至少抛出一个警告也许?

3个答案

0
_评论者:thheller_

最近在# cljs-dev Slack频道中出现了这个问题。这个问题肯定有bug。


(let [href     js/location.href
      location "123"]
  href)

产生的输出

var href_51444 = location.href;
var location_51445 = "123"; // << 这是正确的


在顶层代码中它可以正常工作,但在{{defn}}(以及其他)内部我们会得到


(ns test)
(defn test-fn []
  (let [href     js/location.href
        location "123"]
    href))



test.test_fn = (function test$test_fn(){
var href = location.href;
var location = "123"; // << 这是错误的
return href;
});


0

评论者:dnolen

快速查看后,似乎我们可能没有始终如一地检查 :js-globals,而是经常只关注局部变量?现在 externs 推理已经成为一种机制,我们应该可能从所有已知的 externs 计算得出 :js-globals,而不是我们现在所拥有的明显不完整清单。

0
by
参考:https://clojure.atlassian.net/browse/CLJS-1899 (由tonsky报告)
...