من سعي مي كنم جواب هر 2 سوال را يكجا بدم:
بعضي از زبانهاي برنامه نويسي اجازه تعريف كردن متغير به صورت dynamic را مي دهند بدين معني كه نام و مقدار متغير در runtime مشخص مي شود همچنين نام متغير مي تواند خود متغير باشد و يا در تتيجه يك فرايند منطقي بدست آيد. فلش يكي از اين زبانهاست.
از زمان فلش 4 دو دستور eval و set براي ايجاد و بازخواني متغير ها وجود دارند. براي مثال براي ايجاد 10 متغير به نامهاي a0 تا a9 با مقدار هاي 0 تا 9 مي توان از set استفاده كرد:
کد:
for(var i=0; i<10; i++)
{
set("a" + i, i);
}
همچنين براي بازخواني متغيرهاي بالا مي توان از eval استفاده كرد:
کد:
for(var i=0; i<10; i++)
{
trace(eval("a" + i));
}
eval وظيفه تبديل يك String را به Identifier و دستور set وظيفه نسبت دهي يك مقدار به يك متغير و ايجاد Identifer را به عهده دارند، Identifer در فلش هر آن چيزي است كه مقداري را در خود نگهداري مي كند مانند اسامي كلاسها، MovieClip ها، Object ها و يا متغير هاي ساده.
اين دو دستور هر دو دستورهاي قديمي هستند شايد در يكي دو نسخه آيده فلش اين دستورات deprecate شوند. من تقريبا در هيچ جا استفاده اي براي اين دو دستور نمي بينم.
از زمان فلش 5 امكان localize كردن data بر روي object ها با استفاده از Dot Notation و همچنين Bracket Notation وجود دارد بنابراين مي توان از اين روش به جاي استفاده از eval و set استفاده كرد:
هنگامي كه يك متغير معلوم را در root_ تعريف مي كنيم مي توانيم از Dot Notation براي ايجاد و بازخواني استفاده كنيم:
کد:
_root.variable = 1;
trace(_root.variable);
ولي وقتي بخواهيم يك متغير ديناميك تعريف كنيم Bracket Notation استفاده ميكنيم:
کد:
_root["variable"] = 1;
trace(_root["variable"]);
اين شيوه كارامد تر و از نظر OO كاملتر از eval و set مي باشد بنابراين مثال بالا با اين روش به صورت زير در مي آيد:
کد:
for(var i=0; i<10; i++)
{
this["a" + i] = i;
}
for(var i=0; i<10; i++)
{
trace(this["a" + i]);
}
استفاده هاي زيادي از Bracket Notation در فلش ميشود مثلا مي توان كليه property هاي يك Object را مرور كرد:
کد:
obj = {val1:1, val2:2, val3:3, val4:4};
for(var i in obj) trace(i + ": " + obj[i]);
و يا يك نكته بسيار جالب اينكه با استفاده از اين روش مي توان متغير هايي يا نام هاي غير مجاز ايجاد كرد:
کد:
this["123"] = new Object();
this["123"]["@yahoo.com"] = new Object("[email protected]");
trace(this["123"]["@yahoo.com"]);
در صورتي كه هرگز نميتوان اين متغيرها را به صورت Dot Notation استفاده كرد: