鍍金池/ 問答/HTML/ js參數(shù)傳遞的問題

js參數(shù)傳遞的問題

這個是javascript編程精解中的 參數(shù)傳遞一章中的內(nèi)容:

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

如果函數(shù)f接受多個參數(shù),那么該函數(shù)只能接收第一個參數(shù),我們可以為內(nèi)部函數(shù)添加多個參數(shù)(arg1,arg2等),然后將這些參數(shù)傳遞給f,但問題在于noisy函數(shù)并不知道f函數(shù)需要多少參數(shù)。因為noisy函數(shù)只能傳遞固定數(shù)量的參數(shù)給f,因此也不能獲取函數(shù)的argument.length,函數(shù)f沒有辦法知道調(diào)用者傳遞給noisy的參數(shù)個數(shù)

其中,粗體部分我有一些不理解
1.noisy函數(shù)不知道f需要多少參數(shù)。 - f函數(shù)是自己寫的吧。。那為什么不知道f需要多少參數(shù),假設(shè)f函數(shù)是function(num1,num2){},那不就是2個參數(shù)嗎..
2.因此也不能獲取函數(shù)的argument.length。。這是為什么呢?

題外話:這本書是大學(xué)的時候發(fā)的,題主是一步一步看著書來的,但是書中確實講的不是很詳細,不太適合初學(xué)者,關(guān)于閉包幾句話就過去了。。。感覺有些吃力。可否問一下老鐵們有沒有適合初學(xué)者的書推薦呢?如果空余話也可寫幾句學(xué)習(xí)js的大致方向。感激不盡!

回答
編輯回答
茍活

首先第一個問題
f函數(shù)是自己寫的沒錯,當我傳遞了兩個參數(shù)。并將arguments返回

function f(num1,num2){

return arguments.length;

}

這里我們f函數(shù)想得到兩個參數(shù),num1和num2。但在實際調(diào)用noisy的時候我們是這樣用的

noisy(f)(1,2);

OK! 明明我們傳遞了兩個參數(shù)給noisy里面的匿名函數(shù),那么結(jié)果呢。

clipboard.png

也就是說,如果通過匿名函數(shù)來調(diào)用f,我們無論如何都只是將第一個參數(shù)傳遞給arg,自然讀出的也就是一個參數(shù)咯。
所以并不知道f需要幾個參數(shù)(反正無腦,就只給一個)

第二個問題也迎刃而解。

至于書(臥槽,大學(xué)竟然會發(fā)js相關(guān)的書)的話,犀牛書 紅寶書都挺不錯的,js基礎(chǔ)挺關(guān)鍵,建議多看es6的內(nèi)容,其實本人也是小白,啊哈哈
遛啦遛啦

2018年7月2日 13:38
編輯回答
不歸路
function noisy(f){
    return function(arg){
        console.log("calling with",arg);
        var val = f(arg);
        console.log("calling with",arg,"- got", val);
        return val;
    };
}

如果函數(shù)f接受多個參數(shù),那么該函數(shù)只能接收第一個參數(shù),我們可以為內(nèi)部函數(shù)添加多個參數(shù)(arg1,arg2等),然后將這些參數(shù)傳遞給f,但問題在于noisy函數(shù)并不知道f函數(shù)需要多少參數(shù)。因為noisy函數(shù)只能傳遞固定數(shù)量的參數(shù)給f,因此也不能獲取函數(shù)的argument.length,函數(shù)f沒有辦法知道調(diào)用者傳遞給noisy的參數(shù)個數(shù)
逐句解析:

  • 如果函數(shù)f接受多個參數(shù),那么該函數(shù)只能接收第一個參數(shù)================因為返回函數(shù)中只有一個參數(shù)arg;

  • 我們可以為內(nèi)部函數(shù)添加多個參數(shù)(arg1,arg2等),然后將這些參數(shù)傳遞給f===========內(nèi)部函數(shù)即返回函數(shù)(可見示例);

  • noisy函數(shù)并不知道f函數(shù)需要多少參數(shù)。因為noisy函數(shù)(這里指的應(yīng)該是它的返回函數(shù),因為f的參數(shù)是從返回函數(shù)的參數(shù)拿的)只能傳遞固定數(shù)量的參數(shù)給f =============就是說f函數(shù)所接受的參數(shù)只能由noisy()返回函數(shù)的參數(shù)決定,arg對應(yīng)arg嘛;

  • 也不能獲取函數(shù)的argument.length,函數(shù)f沒有辦法知道調(diào)用者傳遞給noisy的參數(shù)個數(shù)===================確實無法獲取調(diào)用者傳遞給noisy的參數(shù)個數(shù),具體理解可以看下面:

借樓上例子:

function sample(num1, num2) {

      return arguments.length;
    }

運行 noisy(sample)(1,2), f = sample 函數(shù),這里noisy()函數(shù)有一個參數(shù)sample,只在返回函數(shù)里用到了,這樣子看 (noisy(sample))(1, 2) , 用foo = (noisy(sample)),
也就是

foo(1,2) = function(arg){
        console.log("calling with",arg);   //看這里函數(shù)只需要一個參數(shù)arg。你多傳了,函數(shù)不會報錯,但用不到,實參兩個只對應(yīng)了一個形參,有一個沒地方放了。
        var val = sample(arg);   //這里已經(jīng)代入了sample(),這里sample傳入了一個參數(shù)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

上例和下例結(jié)果一樣:

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         

這書確實看著不明白,還是重在理解會用就好 不用管它

2018年6月28日 21:49