■ 基本的なこと
JavaScript は statement-set
statement
1つ以上の式やキーワード、演算子などから成る
終端には、[ ; ]をつける ie. [;] がステートメントの終わり
Sensitive( 大文字, 小文字 のちがいあり)
// ERROR
var s = new string;
// OK
var s = new String;
■ コメント(Comment)
Comment は評価されないが, Read されるので処理が重くなる
( Interpreter が評価するため )
■ Function.関数
// 定義する場所は call する前ならばどこでも良い
// < head>〜< /head> 間 | 外部ファイル
function func(hour, min, sec) {
var ret = hour * 3600 + min * 60 + sec;
return( ret );
}
// call
ret = func(12, 34, 56);
■ 無名関数
addHandler ( function() { } );
■ 変数(Variable)
DESC
JScript の変数のスコープは 3 つ
ローカル変数
関数が実行されるたびに生成
関数をぬけると破棄
関数の外部からは、変数にアクセスできません
GUIDELINE
同一名は利用しない
WARNING
C++ のような BlockScope は使えない
関数内の i は同じ
// 3 * 3 = 9 回のループにはならない
function foo()
{
for( var i=0; i< 3; i++ ){
WScript.echo( "oya " + i );
// BlockScope はなし
if (0) {
for( var i=0; i< 3; i++ ){
WScript.echo( "kodomo " + i );
}
}
else {
for( var j=0; j< 3; j++ ){
WScript.echo( "kodomo " + j );
}
}
}
}
ローカル変数が宣言されている関数の中では
"ローカル変数だけ" が見える
Local変数は, Global変数をかくす
( "参照可能範囲" という )
// Global 変数
var aNumber = 100;
// 変数の宣言は Code の実行前に 処理される
function tweak()
{
// 外の "aNumber" のつもりだが, 関数内の "aNumber"
var s = "aNumber is " + aNumber;
return s;
if (false) {
// この宣言は, 外の "aNumber" をかくす( 上書きする )
var aNumber;
aNumber = 123;
}
}
変数および定数をすべて検出した後、関数内のコードが実行される
ローカル定数の値は、定数の宣言ステートメントが実行されるまで未定義です
関数で変数への代入が実行されるまでは、変数も未定義です
JScript では
変数と定数の宣言はすべてコードの実行前に処理される
宣言が条件ブロックや他の構造の内部にあるかどうかは処理には関係なし
変数, 定数をすべて検出した後
関数内のコードが実行される
ローカル定数の値は
定数の宣言ステートメントが実行されるまで未定義
また、関数で変数への代入が実行されるまでは、変数も未定義
function isEnvVista()
{
var ret = 0;
var sh = new ActiveXObject("WScript.Shell");
var WshEnvironment = sh.Environment("Process");
// これは 関数内 のみの Scope
var val = WshEnvironment.item("HOMEPATH");
if ( val.search(/Documents and Settings/) >= 0 ) {
WScript.echo ( "env is XP" );
}
else {
WScript.echo ( "env is VISTA" );
ret = 1;
}
return ret;
}
print( isEnvVista() );
// val は宣言されてません ( Runtime Error )
print( val );
■ Include
DESC
Include という構文がないため eval() で代用する
eval は引数に渡された文字列を Interpreter で Code として評価する
WARNING
eval で評価する 文字列( code ) では file 操作が禁止になる
file 操作の関数は module にしないこと
TIP
変数は File 単位でとじる
C, C++ のように File をまたいで共有することはない
main 側で module にあたるファイルを Include( Eval )する
// 共通の module を Include( Eval )する
eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile("d:/common.js", 1).ReadAll() );
■ 演算子
SYNTAX
!exp
DESC
式の論理否定
//var b = true;
var b = false;
print( !d );
if ( !d ) {
print("true");
}
// undefined はだめ
d=0;
// increment, decrement
var i = 0;
// 後置
i ++;
// 前置
++ i;
■ cast(キャスト)
明示的にキャストするには 型の識別子の後に式をかく
// string
var s = String( 123 );
// number
var n = Number( "123" );
文字列と 数値の比較 OK
if ( 10 == "10" )
{
WScript.echo("aaa");
}
■ Bit(ビット演算)
var n = 8;
if ( n & 1 ) {
WScript.echo( "flag ON" );
}
else {
WScript.echo( "flag OFF" );
}
■ type(typeof)
SYNTAX
typeof( exp )
DESC
型情報を文字列で返す
"number"、"string"、"boolean"、"object"、"function"、"date"、"undefined"、"unknown"
// string
var y = "Hello";
// object
var z = new Array();
// 未初期化の変数は "undefined" がかえる
if ( typeof ( gObj ) == "undefined" ) {
print( "not init" );
gObj = {};
// object
print( typeof( gObj ) );
}
// Array は object
{
var a = ["aaa"];
print( typeof( a ) );
}
■ object
DESC
すべての Object の基本型
// in 演算子
if ( "prop" in obj ) {
}
// 文字列をかえす
string Object::toString();
// Function 型 Object "foo"
function foo() {
WScript.echo("foo");
}
WScript.echo( foo.toString() );
toString() をすると val の配列が返る
a = ["a", "b", "c" ];
// a,b,c
a.toString();
■ null
DESC
Object がないことをあらわす Object
■ undefined
DESC
//var x = 10;
// 未定義 | 未初期化の変数を調べる
//
if ( typeof( x ) == "undefined" ) {
print("undefined");
}
else {
print("defined");
}