少し慣れてきた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
この記事が気に入ったらサポートをしてみませんか?