我最近一直在编写相当多的 JSX/TSX 代码,并且对这种编程模型有一种奇怪的熟悉感。这是我无法真正放置的东西,直到我再次破解我的 Emacs 配置后取得突破。当您使用 JSX 在 JavaScript 函数中编写 HTML 时,您使用的是准引用。
由 Waifu Diffusion 生成的图像 — 发光的印记、印记、禅宗、阴阳、道教、风景、世界贸易中心、和平、明日方舟、科幻、符文能量、法术
我认为解释这一点的最简单方法之一是使用 Emacs Lisp。 Emacs Lisp 是GNU Emacs的扩展语言,我使用的文本编辑器我非常沉迷于使用在过去十年中一直使用。
Lisp 的主要概念之一是代码就是数据,而数据就是代码。当您使用 Lisp 编写代码时,您正在编写计算机将其解释为代码的链表。例如,考虑一下 Lisp 的这一小部分:
( quote (+ 3 4 ))
您可以使用Mx ielm
ielm
Emacs 中使用 ielm 对其进行评估:
Mx
是 Emacs 中的“alt-x”。 *** Welcome to IELM *** Type (describe-mode) for help. ELISP> (quote (+ 3 4)) (+ 3 4)
将代码引用到数据中是您在 Lisp 中经常做的事情,因此有一个使用单引号字符'
来执行此操作的快捷方式:
ELISP> '(+ 3 4) (+ 3 4)
这很好用,但有时您需要将变量的值放入一些数据中。假设您有这段 Lisp 代码:
( let ((filename " foobar.txt ")) '(filename))
(let ((var1 value) (var2 value)) code)
是你在 Lisp 中声明临时变量的方式。这里变量名filename
设置为"foobar.txt"
。每个变量声明都是一个包含两个元素的列表:变量名及其值。值可以是数据或被评估为数据的代码。如果将其放入 Emacs Lisp 解释器中,您将无法返回您的想法:
ELISP> ( let ((filename " foobar.txt ")) '(filename)) (filename)
您需要有一些方法来引用您想要成为数据的代码,然后有一些方法可以将数据取消引用返回到代码中。幸运的是,Emacs Lisp 允许您使用他们称为Backquoting的结构来做到这一点:
ELISP> ( let ((filename " foobar.txt ")) `(,filename)) (" foobar.txt ")
反引号`
让您像单引号'
一样引用所有内容,但您也可以使用逗号取消引用数据,
将数据转回代码。这使您可以构建复杂的数据结构,如属性列表,以转换为 HTTP 表单数据:
ELISP> ( let ((fname (buffer-name)) (content " Hi there ")) `((fname . ,fname) (content . ,content))) ((fname . " *ielm* ") (content . " Hi there "))
JSX是 JavaScript 的语法扩展,可让您将 HTML 数据与 JavaScript 代码混合。这很像 Lisp 中的准引用。考虑这个小的 JSX 代码块:
const name = "Aoi"; const header = ( <div> <h2>{name}</h2> <p>Hi there, {name}! How are you doing today?</p> </div> ); document.write(header);
这会将此 HTML 的等效内容写入当前页面:
< div > < h2 >Aoi</ h2 > < p >Hi there, Aoi! How are you doing today?</ p > </ div >
您在括号()
内引用 HTML 数据,并使用大括号{}
将 JavaScript 代码取消引用到 HTML 数据中。