对于高级优化中的相同类型的代码,ClojureScript重命名的名称不同

时间:2015-11-20 16:39:31

标签: javascript google-chrome-extension clojurescript

这是Chrome扩展程序的一段代码。

我从ClojureScript开始,所以这可能是一个微不足道的问题,虽然我找到了解决方案,但我仍然不明白问题发生的原因。

这是研磨我的齿轮的代码:

(defn print-and-save-selection
  [info tab]
  (let [selection-text (.-selectionText info)]
    (println info) ;; => #js { bunch of properties, "selectionText" being one }
    (.get js/chrome.storage.sync
          (clj->js {:history nil :historyItems []})
          (fn [items]
            (println items)  ;; => #js {:history nil :historyItems #js []}
            (let [history-items (.-historyItems items)
                  updated-history-items (.concat history-items selection-text)]
              (println updated-history-items)  ;; => correct list in :whitespace mode
              ;; save stuff using other chrome.storage function

我已正确设置了我的外部设备,此代码在:whitespace优化下正常运行,但不在:advanced下。对于后者,它给了我一个"无法阅读的财产' concat'未定义" 。换句话说,(.-historyItems)无法在items中找到合适的元素。如果我将其更改为(aget items "historyItems"),即使在:advanced中也可以。

我无法理解为什么适用于(.-selectionText info)(第三行)的功能不适用于(.-historyItems items),当它们都访问JavaScript对象的属性时。这可能与此代码的嵌套级别有关吗?

为完整起见,生成的代码如下:

:没有年龄的高级

var a = b.selectionText;
...
// a few nested returns and functions ...
    var h = g.Ab, c = h.concat(a);  // => error mentioned above

:使用aget高级

var a = b.selectionText;
...
// a few nested returns and functions ...
    var h = g.historyItems, c = h.concat(a);

1 个答案:

答案 0 :(得分:0)

确实这是一件小事。

事实证明,selectionText属性是在externs文件中定义的,而historyItems是由我在chrome的存储中设置的。因此,相同类型的代码会导致不同的行为。

结论:真正重要的是externs文件中定义的内容。