JavaScript
jQuery
Deferred

気持ち悪いjQuery.Deferred()の挙動

なんでタイプエラーにならないの。。。

$.Deferred().resolve()
.then(null)
.then(function(){
    alert('hoge');
});

確かにjQuery内部の処理を見ると、nullでも次のpromiseを見るようになっていた。。
このため、外部関数をnullになっている箇所でコールするのに失敗してもスルーするようになってしまっていた。。
うーむ。。

//※これはjQuery2.1.3のソース。
jQuery.extend({
    Deferred: function( func ) {
        var tuples = [
                // action, add listener, listener list, final state
                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
                [ "notify", "progress", jQuery.Callbacks("memory") ]
            ],
            state = "pending",
            promise = {
                then: function( /* fnDone, fnFail, fnProgress */ ) {
                    var fns = arguments; //ここにnullがはいる
                    return jQuery.Deferred(function( newDefer ) {
                        jQuery.each( tuples, function( i, tuple ) {
                            var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; //fnはfalse
                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
                            deferred[ tuple[1] ](function() {
                                var returned = fn && fn.apply( this, arguments ); //returnedもfalse
                                if ( returned && jQuery.isFunction( returned.promise ) ) {
                                    returned.promise()
                                        .done( newDefer.resolve )
                                        .fail( newDefer.reject )
                                        .progress( newDefer.notify );
                                } else { //新しいDeferredをresolvedで返す。
                                    newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
                                }
                            });
                        });
                        fns = null;
                    }).promise();
                },
                      ~略~
            },