Javascript ではさまざまなオブジェクトのプロパティ(=変数)にアクセスすることが出来ます。
function testfunc(p1,p2)
{
var v1, v2;
testfunc.f1 = 2; //(1)
v1 = 3; //(2)
p1 = 4; //(3)
this.oo1 = 6; //(4)
go = 5; //(5)
}
順番に見ていくと、(1)はこの関数オブジェクトのプロパティ f1 に 2 を設定しています。ここで設定した値は、この関数オブジェクトが存在する限りそのままの値を保持します。仮にその関数がトップレベルで宣言されていた場合、delete 等で明示的に消去しない限りずっと存在していることになります。
(2)は、いわゆるローカル変数 v1 へのアクセスになります。Javascript の概念的には、この関数を実行されたときに作成されたアクティベーションオブジェクトのプロパティへのアクセスと言うことになります。この関数が制御を戻すと変数は消滅します。ただし、その変数を参照している内部関数を返り値として使用された場合は、クロージャが作成されることとなり、そのまま存在し続けます。
(3)は、いわゆる関数の仮引数として宣言されている変数への参照になります。これは、この関数実行時に作成されたアクティベーションオブジェクトのプロパティの一つである arguments オブジェクトのプロパティと同値になります。p1=arguments[0]、p2=arguments[1] です。実際に渡された引数の個数は arguments.length で参照できます。
(4)は、この関数実行時に渡された this オブジェクトのプロパティへのアクセスになります。this オブジェクトは、この関数の呼び出し方法によりいろいろ異なります。
最後の(5)は、この関数の外側にある変数の参照です。一つ外側にある関数のローカル変数や仮引数、もしくは、この関数がトップレベルの場合はグローバルオブジェクトのプロパティを参照しています。