做图形设计时,很多人会用到脚本自动化处理任务,比如批量导出、自动排版。写脚本就绕不开变量,而全局变量和局部变量的混淆,常常让人抓耳挠腮——明明赋了值,怎么一会儿能读到,一会儿又变成 undefined?
厨房里的比喻:全局是公共冰箱,局部是个人便当盒
想象你在公司厨房。全局变量就像放在公共冰箱里的食材,谁都能拿。而局部变量是你自己的便当盒,只有你自己打开饭盒那会儿才能用。一合上盖子,别人根本不知道你带了啥。
在 JavaScript 脚本里,比如你用 Adobe Illustrator 的 ExtendScript 写自动化操作:
var globalColor = "#ff0000";
function applyHeaderStyle() {
var localFontSize = 24;
app.activeDocument.textFrames[0].textRange.size = localFontSize;
}
function applyBodyStyle() {
app.activeDocument.textFrames[1].textRange.fillColor = globalColor; // 可以访问
app.activeDocument.textFrames[1].textRange.size = localFontSize; // 报错!localFontSize 找不到
}
这里 globalColor 是全局变量,两个函数都能用。但 localFontSize 是 applyHeaderStyle 里的局部变量,出了这个函数,就像便当盒盖上了,applyBodyStyle 根本看不见。
命名冲突也不怕?局部优先
有时候你会不小心重名。比如:
var theme = "dark";
function previewDesign() {
var theme = "light";
alert(theme); // 弹出的是 "light"
}
previewDesign();
alert(theme); // 弹出的是 "dark"
函数内的 theme 遮住了外面的同名变量,就像你贴了名字标签的便当盒,在自己工位上打开时,默认拿自己的。外面那个依然在公共区存着。
图形脚本中常见的坑
新手常犯一个错误:在循环里用 var 声明变量,结果发现变量跑到外面去了。
for (var i = 0; i < 5; i++) {
// 做一些图层复制操作
}
alert(i); // 居然能弹出 5?
因为 var 声明的变量是函数级作用域,不是块级。建议用 let 替代,让它真正“局部”起来。
写设计脚本时,尽量少用全局变量。它们像公共冰箱,放多了容易串味,还可能被别的脚本误改。该私有的就锁进函数里,清晰又安全。