<!DOCTYPE html>
<html>

<head>
    <title>分布函数</title>
    <script type="text/javascript">
    Function.prototype.partial = function() {
        var fn = this,//存储当前方法。即setTimeout
            args = Array.prototype.slice.call(arguments);//用传入的实参使用call方法调用Array对象原型上的slice方法对传入转换为数组

        //这里采用了闭包的方法,闭包内保存了fn 和args值。
        return function() {//在调用函数原型链上的partial方法时返回这个匿名方法
            var arg = 0;//定义并赋值为0,
            for (var i = 0; i < args.length && arg < arguments.length; i++) {//循环调用partial方法时传入的参入
                if (args[i] === undefined) {//如果又一个参数为undefined
                    args[i] = arguments[arg++];//将我们调用setTimeout时的参数进行替换
                }
            }
            return fn.apply(this, args);//this(即window)对象使用applay方法调用之前存储的方法,并传入参数数组args。
        }

    }

    window.onload = function() {
        var delay = setTimeout.partial(undefined, 1000);
        delay(function() {
            alert('a');
        })
    }
    </script>
</head>

<body>
</body>

</html>