2017.6.13
現在、JavaScriptの開発では変数を宣言する際に、
特別な理由がなければ「var」を使用すべきではないとされています。
JavaScript ES6から「let」「const」が追加されたからです。
intra-martにとっても無関係の話ではありません。
現在iAP標準のスクリプト開発プログラムでは、ほとんどの変数宣言が、「var」ではなく「let」によって行われています。
今回はiAP標準のスクリプトプログラムを元に、iAPでの変数宣言についてまとめます。
※iAP標準のスクリプトプログラムはテナントのデプロイ後、以下パスに配置されています。
resinインストールフォルダ/webapps/テナントID/WEB-INF/jssp/platform/src
一般的な変数を宣言する際に使用します。
従来のvarによる宣言と異なり、ざっくりと以下の特徴があります。
・if文などのブロック内で使用した場合、そのブロック内でのみ参照できる。
・同ブロック内での再宣言はできない。(エラーになる)
iAP標準プログラムでは以下のように使用されています。
let loginUserCd = Contexts.getAccountContext().userCd;
代入のしない変数を宣言する際に使用します。
iAP標準プログラムでは以下のように使用されています。
const TIMELINE_TYPE_LIST = imbox.constants.TIMELINE_TYPE_LIST;
宣言時は一般的な定数定義のようにすべて全角文字+スネークケースで定義しています。
ただ、iAP標準プログラムではIMBOX関連のプログラム内でしか使用されておらず、
多くの標準プログラムでは、例えばメッセージ定義の宣言時であってもlet宣言が使用されています。
どの場合にconst宣言を使用するかについては開発チームで取り決めをするとよいでしょう。
letとの違いはletで記載した通りです。
iAP標準プログラムではグローバル変数を宣言する際に使用されていることがあります。
ただ、グローバル変数の宣言でも多くの場合let宣言が使用されています。
以上です。
過去のプログラム資源を変更してまで合わせる必要はないかもしれませんが、
各プログラム内でばらばらになっていると見た目も悪いため、
開発チームで方針を決めておくとよいでしょう。
var, let の動作を簡単に検証したものです。
function init(request){
test1();
test2();
Debug.browse(output);
}
let output = [];
function test1() {
{
let a = 1;
let b = 1;
var c = 1;
var d = 1;
{
let a = 2;
b = 2;
var c = 2;
d = 2;
output.push('a1:' + a); // a1:2
output.push('b1:' + b); // b1:2
output.push('c1:' + c); // c1:2
output.push('d1:' + d); // d1:2
}
output.push('a2:' + a); // a2:1 letは下位ブロック内で再宣言すると別の変数として扱われる
output.push('b2:' + b); // b2:2 letは上位ブロックの宣言が下位ブロックから参照可能
output.push('c2:' + c); // c2:2
output.push('d2:' + d); // d2:2
}
output.push('a3:' + (typeof a !=='undefined' ? a : 'undefined')); // a3:undefined
output.push('b3:' + (typeof b !=='undefined' ? b : 'undefined')); // b3:undefined
output.push('c3:' + (typeof c !=='undefined' ? c : 'undefined')); // c3:2
output.push('d3:' + (typeof d !=='undefined' ? d : 'undefined')); // d3:2
// letは下位ブロックで宣言されると、上位ブロックでは参照不可。varは可能。
}
function test2() {
output.push('a4:' + (typeof a !=='undefined' ? a : 'undefined')); // a4:undefined
output.push('b4:' + (typeof b !=='undefined' ? b : 'undefined')); // b4:undefined
output.push('c4:' + (typeof c !=='undefined' ? c : 'undefined')); // c4:undefined
output.push('d4:' + (typeof d !=='undefined' ? d : 'undefined')); // d4:undefined
// 関数外はlet、varともに参照不可
}