为什么在函数内部创建 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);

错误代码#45:对象无效

在创建 Slider2 后尝试访问 Slider1.name 会导致错误,因为 Slider1 现在是 [无效对象]

我觉得这与引用和垃圾收集有关,但由于 javascript 对象应该作为引用传递并且“addProperty”应该创建一个新对象,我不明白为什么。

无论有没有'var'关键字,我都应该添加它失败

解决方法

这是因为糟糕的 API。一旦您添加或删除了一个属性,如对图层的效果,或对合成的图层,对该图层中的所有效果或合成中的图层的任何引用都将无效。您必须跟踪图层上的所有当前效果并通过索引引用它们,或者向它们添加标识属性,并循环访问与标识符匹配的可用属性。比如在创建效果时

newCtrl.identifier = "ctrl"+ id; //where id is a unique string or number

然后遍历图层的效果并查找标识符

if (thisEffect.identifier === "ctrl"+ id){
    dostuff()
}