js参数传递的问题

这个是javascript编程精解中的 参数传递一章中的内容:

function noisy(f){
    return function(arg){
        console.log("calling with",arg);
        var val = f(arg);
        console.log("calling with",arg,"- got", val);
        return val;
    };
}

如果函数f接受多个参数,那么该函数只能接收第一个参数,我们可以为内部函数添加多个参数(arg1,arg2等),然后将这些参数传递给f,但问题在于noisy函数并不知道f函数需要多少参数。因为noisy函数只能传递固定数量的参数给f,因此也不能获取函数的argument.length,函数f没有办法知道调用者传递给noisy的参数个数

其中,粗体部分我有一些不理解
1.noisy函数不知道f需要多少参数。 - f函数是自己写的吧。。那为什么不知道f需要多少参数,假设f函数是function(num1,num2){},那不就是2个参数吗..
2.因此也不能获取函数的argument.length。。这是为什么呢?

题外话:这本书是大学的时候发的,题主是一步一步看着书来的,但是书中确实讲的不是很详细,不太适合初学者,关于闭包几句话就过去了。。。感觉有些吃力。可否问一下老铁们有没有适合初学者的书推荐呢?如果空余话也可写几句学习js的大致方向。感激不尽!

阅读 2.5k
2 个回答
function noisy(f){
    return function(arg){
        console.log("calling with",arg);
        var val = f(arg);
        console.log("calling with",arg,"- got", val);
        return val;
    };
}

如果函数f接受多个参数,那么该函数只能接收第一个参数,我们可以为内部函数添加多个参数(arg1,arg2等),然后将这些参数传递给f,但问题在于noisy函数并不知道f函数需要多少参数。因为noisy函数只能传递固定数量的参数给f,因此也不能获取函数的argument.length,函数f没有办法知道调用者传递给noisy的参数个数
逐句解析:

  • 如果函数f接受多个参数,那么该函数只能接收第一个参数================因为返回函数中只有一个参数arg;

  • 我们可以为内部函数添加多个参数(arg1,arg2等),然后将这些参数传递给f===========内部函数即返回函数(可见示例);

  • noisy函数并不知道f函数需要多少参数。因为noisy函数(这里指的应该是它的返回函数,因为f的参数是从返回函数的参数拿的)只能传递固定数量的参数给f =============就是说f函数所接受的参数只能由noisy()返回函数的参数决定,arg对应arg嘛;

  • 也不能获取函数的argument.length,函数f没有办法知道调用者传递给noisy的参数个数===================确实无法获取调用者传递给noisy的参数个数,具体理解可以看下面:

借楼上例子:

function sample(num1, num2) {

      return arguments.length;
    }

运行 noisy(sample)(1,2), f = sample 函数,这里noisy()函数有一个参数sample,只在返回函数里用到了,这样子看 (noisy(sample))(1, 2) , 用foo = (noisy(sample)),
也就是

foo(1,2) = function(arg){
        console.log("calling with",arg);   //看这里函数只需要一个参数arg。你多传了,函数不会报错,但用不到,实参两个只对应了一个形参,有一个没地方放了。
        var val = sample(arg);   //这里已经代入了sample(),这里sample传入了一个参数arg(别把arguments搞混),所以val = 1
        console.log("calling with",arg,"- got", val);
        return val;
    };
    //  calling with 1
//calling with 1 - got 1
// 1

如果:

foo(1, 2) = function(arg, arg2){
        console.log("calling with", arg, arg2);   
        var val = sample(arg,arg2);   // 2
        console.log("calling with",arg,arg2,"- got", val);
        return val;
    };
//  calling with 1 2
//calling with 1 2 - got 2
//2

上例和下例结果一样:

function noisy(f) {
      return function () {
        console.log("calling with", ...arguments);
        var val = f(...arguments);
        console.log("calling with", ...arguments, "- got", val);
        return val;
      };
    }

    function f(num1, num2) {

      return arguments.length;
    }
    console.log(noisy(f)(1,2));
    //  calling with 1 2
//calling with 1 2 - got 2
//2         

这书确实看着不明白,还是重在理解会用就好 不用管它

首先第一个问题
f函数是自己写的没错,当我传递了两个参数。并将arguments返回

function f(num1,num2){

return arguments.length;

}

这里我们f函数想得到两个参数,num1和num2。但在实际调用noisy的时候我们是这样用的

noisy(f)(1,2);

OK! 明明我们传递了两个参数给noisy里面的匿名函数,那么结果呢。

clipboard.png

也就是说,如果通过匿名函数来调用f,我们无论如何都只是将第一个参数传递给arg,自然读出的也就是一个参数咯。
所以并不知道f需要几个参数(反正无脑,就只给一个)

第二个问题也迎刃而解。

至于书(卧槽,大学竟然会发js相关的书)的话,犀牛书 红宝书都挺不错的,js基础挺关键,建议多看es6的内容,其实本人也是小白,啊哈哈
遛啦遛啦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题