0

いくつかのjavascriptソースを読んだとき、私は以下のコードを見つけました:

var fullname = function(){
     var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
        return function(name){
          return shorts[name] || name;
      }
 }();

別の関数を返すことで、より効果的ですか、それとも他の理由ですか?使用しない理由:

    function fullname(name){
         var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };
         return shorts[name] || name; 
  }
4

2 に答える 2

2

これは、

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に使用する変数を宣言することです。ABA

 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() { } )() コンストラクトとは? を参照)

于 2013-01-25T08:18:59.220 に答える
0

別の関数内で関数を返すと、クロージャーが作成されます。この場合、内側の関数は object を含む外側の関数スコープにアクセスできますshorts

于 2013-01-25T08:15:41.027 に答える