为什么函数内创建返回的ExtendScript对象会变为无效引用?
ExtendScript 编写效果脚本时对象引用意外失效问题
复现代码
function addControl(layer, name){ newCtrl = layer("Effects").addProperty("Slider Control"); newCtrl.name = name; return newCtrl; } var Slider1 = addControl(ExistingLayer, "slider 1"); $.write(Slider1.name); var Slider2 = addControl(ExistingLayer, "slider 2"); $.write(Slider1.name);
问题表现
代码运行时稳定触发报错:Error Code# 45: Object is invalid
具体流程为:第一次调用addControl生成滑块1并存储为Slider1引用后,首次读取Slider1.name可以正常输出值;等到第二次调用生成滑块2Slider2完成,再尝试读取Slider1.name时,原来的Slider1引用已经直接变为[Invalid Object]状态,抛出对象失效错误。
排查过程与困惑
- 按照通用JavaScript规则,对象本应按引用传递,正常存储的引用不该被意外清空或置为无效
- 本来预期
addProperty方法会生成完全独立的全新效果对象,新建第二个效果根本不会影响之前已经存好的引用 - 试过在函数内部给
newCtrl加上var关键字声明为严格局部变量,该失效问题还是会稳定复现,和变量的作用域声明完全无关 - 目前只能大致猜测问题可能和ExtendScript的特殊引用机制、宿主程序的垃圾回收逻辑相关,但始终无法解释对象失效的根本原因
内容的提问来源于stack exchange,提问作者Kez
相关产品推荐
相关产品推荐

