请在 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语义,所以也许存在解决这个问题的方式?至少显示警告吧, maybe?

3 答案

0
_评论者:thheller_

最近在 #cljs-dev 社交频道中提及了这个问题。确实存在某个地方的错误。


(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,而通常只看局部变量?现在既然外部推断是一个东西,我们可能应该从所有已知的 exterms 计算出 :js-globals,而不是我们现在显然不完整的列表。

0
...