ブラケット演算子とeval結合子の不思議
Flashは、ブラケット演算子([])やeval結合子(eval())にて、連番の変数や特定のルールに乗っ取った変数を動的に生成・参照する事が出来る。
Flashからプログラムを始めた人は、その柔軟な使い方に魅力を感じているはずだ。
しかしながら、ブラケット演算子とeval結合子では返す値が異なる場合がある。
例として、ブラケット演算子([])とeval結合子(eval())を用いた以下のような検証用Classを生成した。
今回、参照にローカル変数、メンバ変数、静的なメンバ変数(static)に対し、public, public static, private, private staticの4種の値を代入して実験。
class TEST { public var _value1:Number = 1; public static var _value2:Number = 1; private var _value3:Number = 1; private static var _value4:Number = 1; public var value1:Number; public var value2:Number; public var value3:Number; public var value4:Number; public function TEST() { var l_value1, l_value2, l_value3, l_value4:Number; l_value1=_value1, l_value2=_value2, l_value3=_value3, l_value4=_value4; value1=_value1, value2=_value2, value3=_value3, value4=_value4; trace("動的変数参照"); trace("--------------------"); for(var i:Number = 1; i <= 4; i++) { trace("■this[]"); trace("_value"+i+" = "+(this["_value"+i])+";"); trace("value"+i+" = "+(this["value"+i])+";"); trace("l_value"+i+" = "+(this["l_value"+i])+";"); trace("-----"); trace("■eval()"); trace("_value"+i+" = "+eval("_value"+i)+";"); trace("value"+i+" = "+eval("value"+i)+";"); trace("l_value"+i+" = "+eval("l_value"+i)+";"); trace("--------------------"); } } } new TEST();
動的変数参照 -------------------- ■this[] _value1 = 1; value1 = 1; l_value1 = undefined;