這個是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é)果呢。
也就是說,如果通過匿名函數(shù)來調(diào)用f,我們無論如何都只是將第一個參數(shù)傳遞給arg,自然讀出的也就是一個參數(shù)咯。
所以并不知道f需要幾個參數(shù)(反正無腦,就只給一個)
第二個問題也迎刃而解。
至于書(臥槽,大學(xué)竟然會發(fā)js相關(guān)的書)的話,犀牛書 紅寶書都挺不錯的,js基礎(chǔ)挺關(guān)鍵,建議多看es6的內(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ù)
逐句解析:
如果函數(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
這書確實看著不明白,還是重在理解會用就好 不用管它
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。