変数のスコープ

変数を定義するときには,とにかく 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

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 f1 = function(arg1, arg2) {
    return arg1 * arg2;
}
f1(3,2); // => 6

直接使う場合:

var a = new Array(3, 2, -6, 8, -4);
a.sort(function (a,b) {return a - b;});
document.write(a.toString()); // => -6,-4,2,3,8