[JS-Flow]JavaScriptコールバック関数



この文章はCore JavaScript特別講座の内容をまとめた.

サマリ


コールバック関数フィーチャー


  • コールバック関数(B)を別の関数(A)のパラメータで渡すと、AはBの制御権を持つ.

  • (特別な要求(bind)がない限り、予めAに指定された方法でBを呼び出す.

  • 予め決定された方法は、コールバックがいつ呼び出されるか、パラメータにどの値を指定するか、ここで何をバインドするかを含む.
  • 注意!
    コールバックは関数です.
    メソッドに変換しても、関数の定義を超えているだけです.方法のように使われているわけではありません.このバインドは、メソッド呼び出し元ではなくコールバック関数を使用する関数に完全に依存します.
    デフォルトでは、コールバック関数のthisはwindow/global(グローバルオブジェクト)です.

    呼び出された関数にコールバック関数の制御権がありますか?


    1.コールバック関数の「運転点」制御

    var cb = function() {
        console.log('1초마다 실행 된다.');
    };
    
    setInterval(cb, 1000);
    setInterval関数は1秒ごとにコールバック関数を実行し、いつ実行するかを制御します.

    2.コールバック関数「パラメータ」の制御

    var arr = [1, 2, 3, 4, 5];
    var entries = [];
    arr.forEach(function(v, i) {
        entriese.push([i, v, this[i]]);
    }, [10, 20, 30, 40, 50]);
    
    console.log(entries)
    forEach関数では、1番目のパラメータをコールバック関数とし、2番目のパラメータはthisArgを受け入れます.
    コールバック関数は、arrの値として最初のパラメータ、arrのインデックスとして2番目のパラメータを使用します.

    3.コールバック関数の「this」制御

    document.body.innerHTML = '<div id="a">abc</div>';
    
    function cbFunc(x) {
        console.log(this, x);
    }
    
    document.getElementById('a').addEventListner('click', cbFunc);
    
    $('#a').on('click', cbFunc);
    addEventLister関数は、コールバック関数のこれをaddEventListerを呼び出す要素として定義します.
    コールバック関数のパラメータをevent要素に渡すことも定義されています.

    4.注意-コールバックは関数です。

    var arr = [1, 2, 3, 4, 5];
    var obj = {
        vals: [1, 2, 3],
        logValues: function(v, i) {
            if(this.vals) {
                console.log(this.vals, v, i);
            } else {
                console.log(this, v, i);
            }
        }
    };
    
    obj.logValues(1, 2); // this는 obj가 된다.
    arr.forEach(obj.logValues); // this는 window가 된다.
    コールバック関数はwindow/globalで、制御権のある関数が指定しない限りです.