2017年9月6日(水)
[JavaScript] eval()の使い道 #HTML5&CSS3&JavaScript
eval()は、()内の数式や文字列をJavaScriptの構文として実行します。
今まで、全く使ってこなかったeval()ですが、使い道がありました。
例として、日付に関するプログラミングで説明します。
元々の_new_date_unix($num)関数は、引数にUNIXミリ秒を与えると、日付オブジェクト$dateおよびその日付変数群を作成してくれました。
-- プログラミング --
<script>
$week = new Array("日","月","火","水","木","金","土");
function _new_date_unix($num){
if(typeof $num === "undefined"){
// 現時刻
$date = new Date();
}else{
$date = new Date($num);
}
$y = $date.getFullYear();
$m = $date.getMonth()+1;
$d = $date.getDate();
$w = $week[$date.getDay()];
$date_text = $y+"年"+$m+"月"+$d+"日("+$w+")";
$date = new Date($y,$m-1,$d);
$unix = $date.getTime()/1000');
}
</script>
--
開始日付と終了日付を比較したりするために、年の変数を$start_y = $y、$end_y = $yと、わざわざ関数の外で格納していました。
関数内で、異なる変数名を作成できないかということで、eval()の登場です。
_new_date_unix($num,$str)は、UNIXミリ秒[$num]と頭名[$str]の2つの引数で、頭名の付いた日付オブジェクトとその日付変数を作成します。
-- プログラミング --
<script>
$week = new Array("日","月","火","水","木","金","土");
function _new_date_unix($num,$str){
if(typeof $str === "undefined"){
$str = "";
}else{
$str += "_";
}
if(typeof $num === "undefined"){
// 現時刻
eval('$'+$str+'date = new Date()');
}else{
eval('$'+$str+'date = new Date($num)');
}
eval('$'+$str+'y = $'+$str+'date.getFullYear()');
eval('$'+$str+'m = $'+$str+'date.getMonth()+1');
eval('$'+$str+'d = $'+$str+'date.getDate()');
eval('$'+$str+'w = $week[$'+$str+'date.getDay()]');
eval('$'+($str==""?'date_':$str)+'text = $'+$str+'y+"年"+$'+$str+'m+"月"+$'+$str+'d+"日("+$'+$str+'w+")"');
eval('$'+$str+'date = new Date($'+$str+'y,$'+$str+'m-1,$'+$str+'d)');
eval('$'+$str+'unix = $'+$str+'date.getTime()/1000');
}
</script>
--
つまり、引数$strに何も指定しないと、日付オブジェクト名は$dateになりますが、"start"を指定すると、$start_dateになります。
P.S. PHPでは、変数名を別の変数で指定できる『可変変数』があって便利です。
-- PHPプログラミング --
<?php
$str = "$str2";
$str2 = "Hello!";
echo $$str; // echo $str2;に同じ。
?>
--
↓
-- 表示 --
Hello!
--
しかし、JavaScriptにはありません。ちなみに、JavaScriptには$$メソッドというものがあります。
P.S.2 JavaScriptで『可変変数』もどきなことができますが、それは次回ということで。