これは、
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
function fullname(name){
return shorts[name] || name;
}
...それがすることで。しかし
var fullname = function(){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return function(name){
return shorts[name] || name;
}
}();
shorts
...ハッシュ/オブジェクトが*関数に対してのみプライベートであることを保証しますfullname
*。
だからあなたの質問に答えるために、
function fullname(name){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return shorts[name] || name;
}
Here'shorts
は 内に隠されていますfullname
が、Dogbert が指摘するように、各呼び出しでshorts
ハッシュが作成されるため、遅くなります。
しかし、これにより、両方の長所が得られます。
var fullname = function(){
var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
return function(name){
return shorts[name] || name;
}
}();
shorts
非公開のままfullname
であると同時に、一度shorts
だけインスタンス化されるため、パフォーマンスも良好になります。
これは、IIFE (Immediately Invoked function expression) と呼ばれるものです。アイデアは、関数A
内に関数を作成し、関数のみがそれらを見ることができるように、関数のスコープ
内で関数B
に使用する変数を宣言することです。A
B
A
var B = function(){
// this is B
//
val foo = {x:1}; // this is ONLY for A
val A = function(arg0) {
// do something with arg0, foo, and whatever
// and maybe return something
};
return A;
};
val A = B();
ご覧のとおり、それは
var A = (function(){
// this is in 'B'
//
val foo = {x:1}; // this is ONLY for A
return function(arg0) { // this is in A
// do something with arg0, foo, and whatever
// and maybe return something
};
})(/*calling B to get A! */);
機能的には、これはまったく同じです
val foo = {x:1}; // foo is visible OUTSIDE foo!
val A = function(arg0) {
// do something with arg0, foo, and whatever
// and maybe return something**strong text**
};
他の用途は見当たりません。
したがって、これは変数を非公開に保つ方法であり、同時にパフォーマンスを低下させません。
( JavaScript の (function() { } )() コンストラクトとは? を参照)