在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

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

回答
編輯回答
茍活

首先第一個(gè)問(wèn)題
f函數(shù)是自己寫(xiě)的沒(méi)錯(cuò),當(dāng)我傳遞了兩個(gè)參數(shù)。并將arguments返回

function f(num1,num2){

return arguments.length;

}

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

noisy(f)(1,2);

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

clipboard.png

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

第二個(gè)問(wèn)題也迎刃而解。

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

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

  • 如果函數(shù)f接受多個(gè)參數(shù),那么該函數(shù)只能接收第一個(gè)參數(shù)================因?yàn)榉祷睾瘮?shù)中只有一個(gè)參數(shù)arg;

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

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

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

借樓上例子:

function sample(num1, num2) {

      return arguments.length;
    }

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

foo(1,2) = function(arg){
        console.log("calling with",arg);   //看這里函數(shù)只需要一個(gè)參數(shù)arg。你多傳了,函數(shù)不會(huì)報(bào)錯(cuò),但用不到,實(shí)參兩個(gè)只對(duì)應(yīng)了一個(gè)形參,有一個(gè)沒(méi)地方放了。
        var val = sample(arg);   //這里已經(jīng)代入了sample(),這里sample傳入了一個(gè)參數(shù)arg(別把a(bǔ)rguments搞混),所以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         

這書(shū)確實(shí)看著不明白,還是重在理解會(huì)用就好 不用管它

2018年6月28日 21:49