27函數(shù)

JavaScript 函數(shù)重中之重

  • 函數(shù)的五種聲明方式
  • 如何調(diào)用函數(shù)
  • 什么是call stack
  • this 和 arguments
  • 作用域
  • 閉包
    function 函數(shù)名(參數(shù),參數(shù)2){執(zhí)行代碼,return 結(jié)果} 就像一個過濾器,放進參數(shù),輸出結(jié)果.

如何聲明一個函數(shù)?

  1. 具名函數(shù)
    function x(輸入1,輸入2){
    return undefined
    }
    注意: 變量可以是7種(null undefined boolean string number symbol object)類
    型,但是函數(shù)變量是變量的特例.
  • console.log() 括號里面只接受字符串,如果不是將會調(diào)用對象的toString方法
  • 因為函數(shù)永遠有一個return返回值,所以即使是console.log()返回undefined因為console的源代碼也是用一個函數(shù)來實現(xiàn)的,函數(shù)自帶一個默認return undefined.
  • console只是打印一個對象,并不是返回一個對象.undefined是來自于他的源代碼函數(shù)自帶的默認返回值
  1. 匿名函數(shù) var a = function (){} //這是第二種聲明方法 var a = function b(){}//這是第三種聲明方法
  • 具名函數(shù)function v(){ } 與 匿名函數(shù) var a = function v(){} 的區(qū)別在于? 變態(tài)之的地方在于具名函數(shù) console.log(v) 返回函數(shù);匿名函數(shù) 報錯. 同樣的語法擺在不同的位置,意義不一樣,這就是不一致,就是垃圾
  • 函數(shù)的第四種聲明是window.Function a = new Function('x','y','return + x+y')

函數(shù)第五種聲明就是箭頭函數(shù)

  • sam = (x,y)=>{return x+y} 如果只有一個語句,可以去掉return和花括號,這是一起去掉的; 所以上面的函數(shù)等價于 sam= (x,y)=>x+y
  • 如果參數(shù)只有一個,(括號)也可以省掉sam=x=>x*x
  • 箭頭函數(shù)是匿名函數(shù),沒有名字的
  • 如果花括號里面要放多個語句,那么就用分號

函數(shù)的name屬性

  • 所有函數(shù)都有一個屬性,如果是具名函數(shù)name就是名字;如果是匿名函數(shù),name就是變量,如果兩邊都有的話:var f3 = function f4(){} ;f3的name是'f4'
  • 如果是用new產(chǎn)生的,那么他的name就是匿名(anonymous)

數(shù)據(jù)是可以直接用的,但是函數(shù)是要調(diào)用的

函數(shù)到底是什么?

  • 阮一峰說的 函數(shù)就是一堆代碼的組合,說了等于沒說.函數(shù)就是代碼塊,什么意思呢? 函數(shù)就是一段可以反復調(diào)用的代碼塊/函數(shù)還能接受輸入不同的參數(shù)返回不同的值.

函數(shù)內(nèi)存

  • 函數(shù)代碼塊里面的內(nèi)容是被當成字符串存在內(nèi)存里面.
  • 兩種不同聲明函數(shù)的方式,不同的內(nèi)存方式:
  1. 具名函數(shù): function f (x,y){return x+y} f 存一個地址,指向heap一塊內(nèi)存,這塊內(nèi)存存有2個東西.一個是params[x,y] 另外一個就是fbody{return x + y};這塊內(nèi)存又指向Function 函數(shù)對象,使用他的call方法
    用內(nèi)存實現(xiàn)一個函數(shù)是怎樣的呢?//eval 這是一個把字符串當成代碼執(zhí)行的函數(shù)

利用內(nèi)存原理,寫出函數(shù)的代碼.

var f = {}
f.name = 'f'
f.params= ['x','y']//這個是假設(shè)的的屬性
f.functionBody='console.log('xxxx')'
f.call = function(){return window.eval(f.functionBody)}
//這里穿插一個知識點,為什么要用函數(shù)包裝Window......這些代碼給f.call而不是直接用? 個人認為應(yīng)該是用函數(shù)有利于擴展,日后更改代碼可以直接在函數(shù)內(nèi)增刪改查代碼,而直接賦值就沒有這個功能,而且直接賦值直接給一個值,而不是一個函數(shù)地址,兩者的內(nèi)存不一樣.
// 這樣就清楚了f 與f.call的區(qū)別了,f只是一個函數(shù),f.call是執(zhí)行這個函數(shù)體

那么函數(shù)的本質(zhì)我們就知道了:可以執(zhí)行代碼的對象就是函數(shù)

  • 那么f.call(硬核hardcore) 為什么不用f(糖sweet)? // 實際上f.call才是JavaScript真正的用法,f()是給小白用的,這對于領(lǐng)悟this有很大的意義
  • f.call()怎么用???

什么是this? f.call(undefined,1,2) undefined就是this;[1,2]就是arguments

// call的第一個參數(shù)可以用this得到,call后面的參數(shù)可以用arguments得到

  • 在普通模式下,f.call(undefined)這個undefined//也就是this,默認是Window
  • 也就是說f.call(第一個參數(shù)就是this)// JavaScript中的this 就是因為當年JavaScript研發(fā)的時候,老板要求開發(fā)的語言像java,這個歷史原因造成的
  • arguments是一個偽數(shù)組: 偽數(shù)組就是具有數(shù)組鍵值對的形式,還有l(wèi)engh,但是沒有指向Array原型,也就是說一個對象的proto(甚至整個原型鏈)沒有指向Array.prototype,所以它缺失了真正數(shù)組所具備的一些屬性,比如push.
  • 一句話總結(jié),call的第一個屬性就是this,其他后面的就是arguments,因為歷史原因本來一個argument搞定,但是強行搞了一個this來.

JavaScript函數(shù)調(diào)用,stack內(nèi)存與heap內(nèi)存的過程

  • 多層函數(shù)調(diào)用(穿越時空)就相當于有存檔的走迷宮
  • 遞歸函數(shù)的調(diào)用,就像有存檔的樓梯探險
  • 當stack內(nèi)存被爆掉

JavaScript中的作用域就是樹

-注意一句很錯誤的話:沒有用var 聲明的變量,a =3 聲明的就是全局作用域的變量a,這是很錯誤的話. 首先a=3是一個賦值語句,他是賦值給a,但是當前作用域沒有,就會沿著作用域鏈網(wǎng)上找,直到找到a賦值給他.如果沒有a,也就是說整個作用域都沒有,就會聲明一個a并賦值給他,這時候才是叫 聲明了一個全局作用域a,并賦值3給他.

  • 穿越時空,就近原則.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,184評論 0 13
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,863評論 0 38
  • 1.函數(shù)參數(shù)的默認值 (1).基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認值,只能采用變通的方法。
    趙然228閱讀 701評論 0 0
  • 芳齡二十好幾, 踩在青春的尾巴上岌岌可危。 悲涼的回望過去, 盡是滿目蒼涼…… 添許矯情, 用文字祭奠已逝的青春。...
    凌泛漣漪閱讀 241評論 0 2
  • 標題來自五月天的一首歌“有些人經(jīng)過我身旁,在我心里鉆洞……” 西瓜先生在我心里鉆了個洞 看了篇愛情故事,然后想起了...
    alaeala閱讀 440評論 0 0