这是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);
答案 0 :(得分:0)
确实这是一件小事。
事实证明,selectionText
属性是在externs文件中定义的,而historyItems
是由我在chrome的存储中设置的。因此,相同类型的代码会导致不同的行为。
结论:真正重要的是externs文件中定义的内容。