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}} 变量遮蔽了全局 I'm trying to access in {{location.href}}。

这种情况是预期的,应该在JS中注意并避开类似问题,但在CLJS中这很令人困惑,因为没有任何提示表明我犯了什么错误以及为什么代码失败。我记得ClojureScript的目标之一是修复JS语义,也许可以解决这个问题?至少抛出一个警告,也许?

3 答案

0
评论由:thheller_ 提供

这最近在#cljs-dev Slack频道上讨论过了。这肯定是有地方出错了。


(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计算:js-globals,而不是目前显然不完整的列表。

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