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

欢迎!请查看关于页面以了解更多关于其运作的信息。

+1
ClojureScript
不确定这是否是一个bug还是预期行为,但是这个


(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;
});


和B{{location}}局部变量{{location.href}}正在尝试访问的全球变量{{location}}发生冲突。

这种事情是预期的,并且在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 inference)已成为可能,我们可能应该从所有已知的外在推断中计算 :js-globals,而不是目前显然不完整列表。

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