5816


Google API の
JavaScriptクライアントライブラリを使っているのですが、グローバル関数から無名関数の処理の中に入る（？）よい方法が思い浮かばず悩んでいます。

</body>の前に、(1)自分のJavaScript読み込み (2)Google API読み込み を記載しています。

[code]

        :
    <script src="MY.js"></script>
    <script src="https://apis.google.com/js/client.js?onload=GoogleApiLoad"></script>
    </body>
    
[/code]

MY.js では、グローバルな名前をできるだけ作らないよう無名関数の中で、Google API とは関係なく先にできる処理を行ってます。

[code]

    !function(){
        // 先にできることいろいろ
    }();
    
[/code]

そして、Google API のロード完了後に、この無名関数の中で処理を続行したいのですが、どんなコードにすればよいのかわかりません。

Google API
の使い方は、ロード完了したタイミングでコールバック関数を実行する方式(client.js?onload=XXX)が公式的なようなので、それに従っています。  
<https://developers.google.com/api-client-library/javascript/start/start-js>

このコールバック関数(上の例ではGoogleApiLoad)は、グローバルな名前でないといけないと思いますが、そうすると、

[code]

    !function(){
        // 先にできることいろいろ
        // Google APIロード完了後はAPIを使っていろいろ
    }();
    
    function GoogleApiLoad(){
        // Google APIロード完了
    }
    
[/code]

・基本は無名関数で自分のJavaScriptコードを実行している中で、  
・Google API がロード完了したら、その無名関数の中でAPIを使って処理を続行する

というやり方をしたい時に、どうすればよいのか・・よい方法が思い浮かびません。。

こういう時は、どうするのがよいのでしょうか？  
よろしくお願いいたします。


CC BY-SA 3.0
2015-02-03T01:11:22.197
5814
2015-02-03T02:27:08.660
2015-02-03T01:22:41.207
8043
8043
question
javascript
グローバル関数から無名（匿名）関数に入りたい


`window` に代入すればグローバル変数になります。この場合 [`this` は `window`
を指す](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Operators/this#Global_context) ので `this`
に代入するのでも構いません。

[code]

    <html>
      <head>
      </head>
      <body>
        <script>
          !function(){
            var anonymousFunc = function() {
               alert('anonymous!');
            };
            // this.GoogleApiLoad でもよい
            window.GoogleApiLoad = function() {
              anonymousFunc();
            }
          }();
        </script>
        <script src="https://apis.google.com/js/client.js?onload=GoogleApiLoad></script>
      </body>
    </html>
    
[/code]


CC BY-SA 3.0
2015-02-03T02:17:36.690
5816
2015-02-03T02:23:54.160
2015-02-03T02:23:54.160
5575
5575
5814
answer


グローバル変数を定義する場合はこうですが…

[code]

    var GoogleApiLoad;
    function() {
        // このスクリプト読み込み時のコード
    
        GoogleApiLoad = function() {
            // モジュールロード後のコード
        }
    }();
    
[/code]

ソースを眺めるとコールバックのデフォルトが `gapi_onload` なので、こうすればいけそう。

[code]

    <head>
    <script type="text/javascript">
    // このブロックは　My.js の中だと仮定して
    !function() {
        // このスクリプト読み込み時のコード
        window.alert("Hello from function()!");
        
        // 読み込み時は定義するだけ
        window["gapi_onload"] = function() {
            // モジュールロード後のコード
            window.alert("Hello from function() again!");
        }
    }();
    </script>
    <script src="https://apis.google.com/js/client.js"></script>
    </head>
    <body>
    </body>
[/code]


CC BY-SA 3.0
2015-02-03T02:27:08.660
5817
2015-02-03T02:27:08.660
4978
5814
answer