少し慣れてきたJScript+WSH 2 自作関数のスコープ確認

はじめに

JSciprtを実装していくと、自作関数を利用することになります。自作関数のスコープを調べてみました。

関数の宣言方法による変数のスコープの挙動

function xxx(){}を使用した場合の変数のスコープ

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

function setVar(){
  WScript.Echo("02: " + str1);	// => 02:undefined
  var str1 = "foofoo";
  WScript.Echo("03: " + str1);	// => 03:foofoo
}

setVar()

WScript.Echo("04: " + str1);	// => 04:foo

変数の挙動は上記も下記も変わらない。

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

setVar()

function setVar(){
  WScript.Echo("02: " + str1);	// => 02:undefined
  var str1 = "foofoo";
  WScript.Echo("03: " + str1);	// => 03:foofoo
}

WScript.Echo("04: " + str1);	// => 04:foo

宣言前の関数を呼び出すことができた。

var xxx = function(){}を使用した場合の変数のスコープ

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

var setVar = function(){
  WScript.Echo("02: " + str1);	// => 02:undefined
  var str1 = "foofoo";
  WScript.Echo("03: " + str1);	// => 03:foofoo
}

setVar();

WScript.Echo("04: " + str1);	// => 04:foo

上記はfunction xxx() {}のパターンと同じ。

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

//setVar();						// =>  実行時エラー: オブジェクトを指定してください。

var setVar = function(){
  //WScript.Echo("02: " + str1);	// => エラーにより実行無し
  var str1 = "foofoo";
  //WScript.Echo("03: " + str1);	// => エラーにより実行無し
}

WScript.Echo("04: " + str1);	// => 04:foo

宣言前の関数は呼び出せず、実行時エラーとなった。

xxx = function(){}を使用した場合の変数のスコープ

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

var setVar = function(){
  WScript.Echo("02: " + str1);	// => 02:undefined
  var str1 = "foofoo";
  WScript.Echo("03: " + str1);	// => 03:foofoo
}

setVar();

WScript.Echo("04: " + str1);	// => 04:foo

上記はfunction xxx() {}、var xxx = function(){}のパターンと同じ。

var str1 = "foo";

WScript.Echo("01: " + str1);	// => 01:foo

//setVar();						// =>  実行時エラー: オブジェクトを指定してください。

var setVar = function(){
  //WScript.Echo("02: " + str1);	// => エラーにより実行無し
  var str1 = "foofoo";
  //WScript.Echo("03: " + str1);	// => エラーにより実行無し
}

WScript.Echo("04: " + str1);	// => 04:foo

var xxx = function(){}のパターンと同様、宣言前の関数は呼び出せず、実行時エラーとなった。

関数自体のスコープの挙動

function xxx(){}を使用した場合のスコープ

setVar();		// => test
WScript.Echo(setVar);	// => setVar = function(){ WScript.Echo("test");}

function setVar(){
  WScript.Echo("test");
}

上記も下記も同じように動作した。functionの記述の前に関数を呼び出せる。
またechoで関数を出力すると、関数の定義が表示されると分かる。

function setVar(){
  WScript.Echo("test");
}

setVar();		// => test
WScript.Echo(setVar);	// => setVar = function(){ WScript.Echo("test");}

var xxx = function(){}を使用した場合のスコープ

var setVar = function(){
  WScript.Echo("test");
}

setVar();				// => test
WScript.Echo(setVar);	// => setVar = function(){ WScript.Echo("test");}

上記は問題なく動作。下記は関数を出力したところ空改行となった。(undefinedではなかった)

//setVar();				// =>  実行時エラー: オブジェクトを指定してください。
WScript.Echo(setVar);	// => (改行のみ表示された)

var setVar = function(){
  WScript.Echo("test");
}

xxx = function(){}を使用した場合のスコープ

setVar = function(){
  WScript.Echo("test");
}

setVar();				// => test
WScript.Echo(setVar);	// => setVar = function(){ WScript.Echo("test");}

上記は問題なく動作。下記は実行時エラーとなった。

//setVar();				// => 実行時エラー: オブジェクトを指定してください。
//WScript.Echo(setVar);	// => 実行時エラー: 'setVar' は宣言されていません。

setVar = function(){
  WScript.Echo("test");
}

おわりに

function xxx(){} で関数を作成したときのみ、関数を記述する前の行でxxx関数を呼び出すことができた。

また、宣言前の関数/変数をechoした結果は下記のとおりであり、関数が変数で挙動が異なることがわかった
var xxx = function(){} →空
var xxx →undefined

この記事が気に入ったらサポートをしてみませんか?