犀牛书第九章类的扩充有段代码看不明白
Number.prototype.times = function (fun,context) {
console.log(Number(this));
    var n = Number(this); //这里的this指代什么,我打印了n显示的是调用的数字
    for(var i=0;i<n;i++) 
        fun.call(context,i);  //context代表什么
}var n = 3;
n.times(function (n) {console.log(n + ' hello')});  //times不是有两个参数么,怎么这里只有一个了???

解决方案 »

  1.   

    /*
        首先:明白,这是对数字类型进行的一个原型扩展,参数有两个
        fun:这是一个回调函数
        context:看命名也能猜出点来了。承继上下文的。原本应该是一个作用域。比如:window
    */
    Number.prototype.times = function (fun,context) {
       //this指的是调用此方法的对象:你举的例子中var n=3;n.times()来调用这个方法。那么:this=3
        console.log(Number(this));
        var n = Number(this);
        for(var i=0;i<n;i++)
            //关于call方法下面说,你也可以在网上找一找
            //按你举例来说,下面这句其实就相当于: fun(i);这个是你传进来的fun=function (n) {console.log(n + ' hello')}
            fun.call(context,i);
    }
    var n = 3;
    n.times(function (n) {console.log(n + ' hello')});关于call方法,网上给你找了个例子,加了点注释。你看完这个例子大概就明白了
        var value="我是全局变量";
        function a(){this.value="我是a的value";}
        function fun1(){alert(this.value);}
        window.fun1();   //我是全局变量
        //下面这句将输出:我是全局变量:
        //下面的调用,就是将fun1中alert(this.value)的this指向了window;变成了:alert(window.value)
        fun1.call(window);
        //下面的调用,就是将fun1中alert(this.value)的this指向了document.getElementById('myText');变成了:alert(document.getElementById('myText').value)
        fun1.call(document.getElementById('myText'));  //document.getElementById('myText').value
        //下面的调用,是先构造了a(),那么,fun1中的alert(this.value)中的this指向了new a();变成了:alert(new a().value)
        fun1.call(new a());//我是a的value
      

  2.   

    this指的是当前调用times的对象,你调用的是n.times,this就是指n。
    context是函数的第二形参,fun.call(context,i)相当于context.fun(i).
    js的函数调用,并非每次都要用到所有形参,这里的context是可选项,当times的第一形参fun中不需要显式调用this时,context不是必要的。当context没有传入时,context的值为undefined
      

  3.   

    补充:js中传参是很自由的,不是定义了多少形参就要传多少个,也不是没定义形参就不能传参了。
    主要是在函数内容根据实际情况处理好参数的默认值
    比如:function fn(a,b,c){
        a=a||1;
        b=b||2;
        c=c||3;
        alert(a+b+c);
    }
    fn(4);//9
    fn(4,5);//12
    fn(null,null,10);//13function fn2(){
        var a=arguments[0]||1,
            b=arguments[1]||2,
            c=arguments[2]||3;
        alert(a+b+c);
    };
    fn2(4);//9
    fn2(4,5);//12
    fn2(null,null,10);//13
      

  4.   

    谢谢楼上两位大大的热心回答,明白了,这段时间都在看犀牛书,一方面是工作上常和js打交道,另一方面是想把js学好,感觉看了后面的前面的有些都忘记了,有什么好的方法么。我是看完之后就把自认为重要的点记下来了,这几天没有复习,看来得多复习下。