function fact(n) {
if (n < 0) return null;
if (n > 0) {
return (n * fact(n-1));
} else {
return 1;
}
}
カテゴリー: JavaScript
arguments
関数定義に仮引数を書かなくても,arguments という配列に格納される。引数の数が不定の場合に便利。
function hello() {
for (var i=0; i<arguments.length; i++) {
document.write("hello,=", arguments[i], "<br>");
}
return i;
}
hello("Andy", "Bill", "Charlie");
変数のスコープ
変数を定義するときには,とにかく var をつけておくのが良さそうだ。
- 関数の外で定義した変数はグローバル
- 関数の中で var を使って定義した変数はその関数内のローカル
- 関数の中で var を使わずに定義した変数はグローバル
関数の中で var を使った場合:
var v1 = "global v1";
function foo() {
var v1 = "local v1";
document.write("in function: ", v1, "<br>"); // => "local v1"
return "function called.";
}
document.write("before function call: ", v1, "<br>"); // => "global v1"
foo();
document.write("avter function call: ", v1, "<br>"); // => "global v1"
before function call: global v1 in function: local v1 avter function call: global v1
関数の中で var を使わなかった場合:
var v2 = "global v2";
function bar() {
v2 = "local v2";
document.write("in function: ", v2, "<br>");
return "function called.";
}
document.write("before function call: ", v2, "<br>");
bar();
document.write("avter function call: ", v2, "<br>");
before function call: global v2 in function: local v2 avter function call: local v2
関数
function add (arg1, arg2) {
var result = arg1 + arg2;
return result;
}
add(2, 5); // => 7
for ~ in
var animals = Array("dog", "cat", "elephant"); // 配列
for (x in animals) {
document.write(x, "<br>");
}
for
var sum = 0;
var i;
for (i=1; i<=10; i++) {
sum += 1;
}
document.write(sum, "<br>");
if
var val1 = 5;
var val2 = 4;
if (val1 < val2)
result = val2;
else
result = val1;
document.write(result);
実行するステートメントが複数なら { } で囲む。
条件演算子もある。
val1 < val2 ? val2 : val1;
連想配列
Array の添字に整数(インデックス)じゃなくて文字列(キー)を使うと連想配列になる。
var pets = new Array();
pets["Andy"] = "dog";
pets["Bill"] = "cat";
pets["Charlie"] = "elephant";
for (name i pets) {
document.write(name, ": ", pets[name], "<br>");
}
こりゃ気持ち悪い。整数の添字と混ぜるとどうなるんだ?
var pets = new Array();
pets["Andy"] = "dog";
pets[1] = "cat";
for (name in pets) {
document.write(name, ": ", pets[name], "<br>");
}
なんでもないかのように動く。
というか,pets[1](添字が整数)と pets[“1”](添字が文字列)を区別していないような感じ。
var pets3 = new Array(); pets3[1] = "dog"; // 整数で代入 document.write(pets3[1], "<br>"); // 整数で参照 => "dog" pets3["1"] = "cat"; // 文字列で代入 document.write(pets3[1], "<br>"); // 整数で参照 => "cat"
やっぱり。
配列
生成
Array コンストラクタを利用する方法。引数に配列のサイズを指定できるけど,必要なら勝手に大きくなってくれる。
var a1 = new Array(); a1[0] = "dog"; a1[1] = "cat"; a1[2] = "elephant";
コンストラクタに値を直接渡す方法。
var a2 = new Array("dog", "cat", "elephant");
リテラル。
var a3 = ["dog", "cat", "elephant"];
要素の型は何でも良い。
var a4 = ["Andy", 16, new Date()];
配列の長さ
長さを得るには length プロパティ。必要なら自動的に長くなる。
var a = new Array("andy", "bill", "charlie");
document.write(a.length, "<br>"); // => 3
a[4] = "eddy";
document.write(a.length, "<br>"); // => 5
document.write(a[3], "<br>"); // => undefined
↑a[3] は代入されてないので,undefind になる。
sort
sort() メソッドに引数には,比較関数を渡す。単純に大小関係で比較するなら省略していい。
var a = [4,2,1,5,6,3];
a.sort();
for (i=0; i<a.length; i++) {
document.write(a[i], ","); // => 1,2,3,4,5,6,
}
比較関数は,2引数 a,b をとって 正の値/0/負の値 のいずれかを返すように作る。
| a > b | 正の値 |
| a == b | 0 |
| a < b | 負の値 |
try ~ catch
例外処理。
try {
var today = Date();
today.set_month(3); // no such method.
} catch (e) {
document.write(e); // => [object Error]
}
例外を発生させるには throw かな。