4641

[code]

    var SM = (function () {
    
      var my = {};
    
      my.get = function (key) {
          return localStorage.getItem(key);
      }
      my.put = function (key, value) {
          return localStorage.setItem(key, value);
      }
      my.delete = function (key) {
          return localStorage.removeItem(key);
      }
      return my;
    }());
    
[/code]

このコードを実行した後に

[code]

    console.dir(SM);
    
[/code]

とするとSMのメソッドとして `get()` `put()` `delete()` の3つが定義されていることが  
わかりますが、これは何故でしょうか。

Javaとかの感覚では

[code]

    SM.my.get(key)
    
[/code]

ならわかるのですが、そのままSMという変数にこのメソッドが生えていることが  
難しく感じました。

なぜこのような挙動をするのか、ご存知の方、教えていただけないでしょうか。

ちなみにこのコードは[こちら](http://www.ibm.com/developerworks/jp/opensource/library/os-
extendchrome/)でGoogleChromeExtensionのチュートリアルとして紹介されていました。

よろしくお願い致します。


CC BY-SA 3.0
2015-01-15T16:42:47.633
4640
2015-01-24T13:54:55.457
2015-01-24T13:16:29.643
4788
5836
question
javascript google-chrome
var SM = (function{ ... }()) で宣言された変数に、メソッドが生成される仕組み・条件が知りたい


本当にすいません、これ自己解決しました・・・。  
単純に関数内で `return my` しているからなんですね。

その箇所を見逃していました。  
お騒がせして申し訳ありません。


CC BY-SA 3.0
2015-01-15T16:47:59.450
4641
2015-01-15T16:47:59.450
5836
4640
answer


もう答えを突き止めたようですが、一言加えますと、この書き方は[IIFE](http://en.wikipedia.org/wiki/Immediately-
invoked_function_expression) (Immediately Invoked Function
Expression)、もしくは即時関数といい、JavaScriptでよく用いられます。

Java、C言語、C++などと違い、JavaScriptの変数のスコープはブロック（`{}`）ではなく、回りの関数で区切っています。

だから、回りに影響を与えずに変数を使いたい場合はIIFEが使えます。IIFE内の変数は外側に漏れません。

[code]

    var total = 30;
    
    if (true) {
        // 以上と同じtotalです { } 括弧は関係ありません
        var total = 40;
    }
    
    var otherTotal = (function() {
      // subTotalはこの中でしか存在しません
      var subTotal = 5;
    
      // 外側のtotalとは別の変数です
      var total = subTotal + 8 * 9;
    
      return total;
    })();
    
    console.log(total);           // 40
    console.log(otherTotal);      // 77
    console.log(typeof subTotal); // "undefined"
[/code]


CC BY-SA 3.0
2015-01-23T21:38:20.977
5180
2015-01-24T13:54:55.457
2015-01-24T13:54:55.457
4788
4788
4640
answer