这是封闭吗?如果是这样,为什么?

cla*_*taq 6 closures clojure

在准备另一个问题的答案时,我为自己创建了一个.考虑以下简短程序.

(ns net.dneclark.JFrameAndTimerDemo
  (:import (javax.swing JLabel JButton JPanel JFrame Timer))
  (:gen-class))

(defn timer-action [label counter]
 (proxy [java.awt.event.ActionListener] []
   (actionPerformed
     [e]
      (.setText label (str "Counter: " (swap! counter inc))))))

(defn timer-fn []
  (let [counter (atom 0)
        label (JLabel. "Counter: 0")
        timer (Timer. 1000 (timer-action label counter))
        panel (doto (JPanel.)
                (.add label))]
    (.start timer)
    (doto (JFrame. "Timer App")
      (.setContentPane panel)
      (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
      (.setLocation 300 300)
      (.setSize 200 200)
      (.setVisible true))))

(defn -main []
  (timer-fn))
Run Code Online (Sandbox Code Playgroud)

在动作监听器'timer-action'中,'counter'参数的值被改变.实际变量在'timer-fn'函数中声明,但在侦听器中被更改.在我之前使用像Pascal这样的语言的经验中,我会认为'counter'可以通过引用传递.这是这种情况还是这个闭包的例子?别的什么?

谢谢您的帮助.

Poi*_*nty 3

是的,这是一个关闭。处理函数定义的词法上下文被保留,当稍后调用它时,它可以访问和更新“存在”在那里的变量。

我不知道如何回答这个问题:“为什么?” 除了指出这只是语言定义的工作方式之外。