第23回 「関数(5)」


 前回は個別に色を指定してメッセージを表示する処理について説明しました。今回はカラー名などが指定されていない場合(エラー処理)について説明します。(前回は下記プログラム)
 
<html>
<head>
<title></title>
</head>
<body>
<script language="JavaScript"><!--
function printMsg(msgAry, col)
{
n = Math.floor(Math.random() * msgAry.length);
document.write("<font color='"+col+"'>");
document.write(msgAry[n],"<br>");
document.write("</font>");
}

msg = [ "こんにちは",
"いい天気",
"みたいですね",
"おしまい",
"やっぱり再開?" ];
printMsg(msg,"red");
// --></script>
<hr>
■今日のことわざ<br>
<script language="JavaScript"><!--
kotowaza = [ "雨降って地固まる",
"人を見たら泥棒と思え",
"ただより高いものはない" ];
printMsg(kotowaza,"blue");
// --></script>
<hr>
</body>
</html>

 カラー名/カラーコードが指定されていない、つまり関数printMsgの引数colに何もないということです。関数内に
 
alert(col);

 の命令を追加して引数colの内容を調べてみるとカラーコードが渡されていない場合、
 
printMsg(msg);

のように呼び出された場合には以下の文字が表示されます。

undefined

これは「未定義」である、つまり何も定義されていませんよ、という事です。それならば引数の内容がundefinedだったら黄色にするには以下のようにすれば良さそうです。

if (col == undefined) col = "yellow";

しかし、これを実行するとエラーになってしまいます。というのもundefinedという予約語がないため変数とみなされエラーになってしまいます。このような場合には「typeof」という命令を使って変数colの種類が何なのかを文字列に変換する必要があります。つまり

if (typeof(col) == "undefined") col = "yellow";

のように書かなければいけません。typeofは現在の値/変数が何なのかを示す文字列を返します。文字列だったら"string"、数値だったら"number"のようになります。
こりゃ面倒だ、という人向けに以下のように否定演算子である「!」を使って書くこともできます。

if (!col ) col = "yellow";

 colが何もないの否定なので何もない場合にはif()の条件は「真」になります。colに色名が入っていれば条件は「偽」となり以後の命令は実行されません。
 実際のプログラムは以下のようになります。(否定演算子を使ったサンプル)
 
<html>
<head>
<title></title>
</head>
<body>
<script language="JavaScript"><!--
function printMsg(msgAry, col)
{
if (!col ) col = "yellow";
n = Math.floor(Math.random() * msgAry.length);
document.write("<font color='"+col+"'>");
document.write(msgAry[n],"<br>");
document.write("</font>");
}

msg = [ "こんにちは",
"いい天気",
"みたいですね",
"おしまい",
"やっぱり再開?" ];
printMsg(msg);
// --></script>
<hr>
■今日のことわざ<br>
<script language="JavaScript"><!--
kotowaza = [ "雨降って地固まる",
"人を見たら泥棒と思え",
"ただより高いものはない" ];
printMsg(kotowaza,"blue");
// --></script>
<hr>
</body>
</html>

 とりあえず、これで色指定を忘れてしまった場合でも動くようになりました。次回は、この関数を別ファイルとして保存し、他のファイルからも再利用できるようにしてみます。






2002-2004 Copyright KaZuhiro FuRuhata (古籏一浩)