JSFL for ... in循环似乎不起作用

Ale*_*ing 0 javascript flash for-loop jsfl

我正在用JSFL for Flash CS5编写一个脚本,我正在尝试从主时间轴上获取一个层列表.我正在获取时间轴,然后使用for ... in循环遍历它,但是我得到的对象似乎未定义.这是我制作的一些测试代码:

alert(fl.getDocumentDOM().getTimeline().layers[0].name); //Returns "text1"

for(layer in fl.getDocumentDOM().getTimeline().layers) {
    alert(layer.name); //Returns "undefined"
}
Run Code Online (Sandbox Code Playgroud)

那么,JSFL不支持...... in?这有点奇怪,因为它似乎只是一个JavaScript引擎.

cwa*_*ole 5

谁在那里.JSFL不仅仅是一个JavaScript引擎,它是奇异的世界JavaScript,可能非常难以预测.不相信我?不确定是否仍然如此,但请尝试fl.getDocumentDOM().selection.push(<obj>).它不起作用,但确实如此:var s = fl.getDocumentDOM().selection; s.push(<obj>) fl.getDocumentDOM().selection = s.

也就是说,你的语法是关闭的:

var layers = fl.getDocumentDOM().getTimeline().layers;
// include 'var' it's good taste
for(var layer in layers) {
    // for... in iterates the KEYS, so you actually have to do a lookup
    alert(layers[layer].name);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你最好用数字索引迭代数组,它更清晰,更快.


Dav*_*art 5

您永远不要使用for..in遍历一个数组,因为它是为对象枚举而设计的。它需要做的是另一个脚本来修改Array.prototype和for..in中断(如果您不相信我,请扩展Object.prototype并观看Adobe IK Tool开始吐出错误!)

在JSFL(使用Spidermonkey JavaScript引擎)中循环遍历数组的最干净方法是:

for each(var layer in layers)
{
    fl.trace(layer.name);
}
Run Code Online (Sandbox Code Playgroud)

PS。@cwallenpole。您所说的选择修改“不可预测性”是正常行为:http : //help.adobe.com/zh_CN/flash/cs/extend/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7f91.html