首页 > 解决方案 > 为什么在函数内部创建 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 现在是 [Invalid Object]

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

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

标签: javascriptextendscriptafter-effects

解决方案


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

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

然后你遍历层的效果并寻找标识符

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

推荐阅读