這個(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é)果呢。
也就是說(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í)本人也是小白,啊哈哈
遛啦遛啦
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ì)用就好 不用管它
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。