Google Maps API・マイマップの使い方・活用法をご紹介しています。

関数リテラル入れ子案:Animating Symbols|Google Maps JavaScript API|Google Developers

さて基本的なアニメーションシンボルのサンプルソースから、
より見やすくメンテナンスしやすい書き方はないものかと、
無名関数を次は関数リテラルとして記述する例をご紹介します。
個人的にはこの記述で決まりかなと思います。

なお、本投稿は以下からの続きです。

サンプルソースについては以下でご紹介しています。

 

関数リテラル入れ子案:Animating Symbols

無名関数では読みにくいし、触りにくい。
別定義関数ではデグレードしてします。

無名関数にパラメータで値を渡しつつも、IEで互換性を保つ記述方法が必要です。

そこで以下のような記述に変更します。
これは無名関数をリテラル記述(定数化・変数化)に変更し、変数に格納しています。


上記のサンプルは以下で表示しています。

※2017/02/23:訂正ライブラリの読み込み忘れによって地図が表示されていませんでした。
表示されるよう訂正しました。

補足

またこの記述にて、以下のようにパラメータの値を、
そのまま無名関数内部で利用しています。

function animateCircle(p_line, p_count) {
var anonyfunc = function() {
p_count = (p_count + 1) % 200; ...}

これについては、
以下のように入れ子で定義した関数による スコープが内包されることによって実現されています。

多重に入れ子にされた関数

関数は多重に入れ子にすることができます。つまり、関数 (A) が関数 (B) を含み、関数 (B) が関数 (C) を含む事ができます。このとき関数 B と C はともにクロージャを形成するので、B は A にアクセスでき、C は B にアクセスできます。さらに、C が アクセスできる B は A にアクセスできるので、C は A にアクセスすることもできます。このように、クロージャは複数のスコープを持つ事ができます。クロージャはそれを内包する関数のスコープを再帰的に内包しています。これは スコープチェーニング (scope chaining) と呼ばれます。(なぜ「チェーニング」と呼ばれるのかは後で説明します。)

(引用)多重に入れ子にされた関数|関数と関数スコープ – JavaScript | MDN

 

この記述方法は以下サイトを参考に記述をしたものです。

関数リテラルは配列リテラルやオブジェクトリテラルなどと同じように変数に代入することができます。

var func = function(引数1, 引数2, …){実行する処理;};

この場合、配列の場合などと同じく関数リテラルに対する参照が変数に代入されることになります。

また関数リテラルを変数に代入せずに関数リテラルを直接呼び出すこともできます。
(function(引数1, 引数2, …){実行する処理;})(引数1, 引数2, …);

具体的には次のように記述します。
var num = (function(x, y){return (x + y)/2;})(10, 8);

上記の場合、変数numには(10 + 8)/2の結果である9が代入されることになります。

(引用)関数リテラル(匿名関数/無名関数) – 関数 – JavaScript入門

 

個人的にはこの記述の方がメンテナンスしやすい

個人的な印象になりますし、好き嫌いはあると思います。

私は、無名関数部分を別で記述し変数に格納しておき、
window.setInterval()で呼び出すこの記述は、
インターバル動作部分の導入が綺麗ですっきりしていると思います。

無名関数を入れ子にする形を取る事で、
window.setInterval()側にパラメータを渡すこともなく、
グローバル変数を利用することもなく、

値の受け渡しができます。

私はこの方法で落ち着こうかなと思っています。

 


公開日:
最終更新日:2017/02/23

コンテンツ
すべて展開 | すべて省略