函數(shù)和作用域

函數(shù)的本質(zhì)

什么是函數(shù)夯尽?

阮一峰給了我們很好地解釋?zhuān)汉瘮?shù)就是一段可以反復(fù)調(diào)用的代碼塊谊娇。函數(shù)還能接受輸入的參數(shù)赠堵,不同的參數(shù)返回不同的值半等。

聽(tīng)不懂莽囤?那我下面的求三角形面積的例子演示一遍谜悟。

那問(wèn)題在于掠归,我們?nèi)绾沃肋@段函數(shù)在內(nèi)存里面是怎么存的?作為一個(gè)程序員悄泥,我們必須知道虏冻,當(dāng)一個(gè)東西被聲明出來(lái)之后,它在內(nèi)存里面是怎么存的弹囚。

那么函數(shù)要怎么存厨相?難道就當(dāng)成字符串來(lái)存在內(nèi)存里嗎?對(duì)的鸥鹉,沒(méi)錯(cuò)蛮穿,函數(shù)就是被當(dāng)做字符串存起來(lái)的:

函數(shù)的整體體系:

函數(shù)的 5 種聲明

  • 變量可以是7種數(shù)據(jù)類(lèi)型:number String Boolean symbol undefined null Object
  • 但是,如果是function聲明一個(gè)函數(shù)x毁渗,那么這個(gè)x只能是對(duì)象里的函數(shù)践磅。這是變量的特例。
  • 控制臺(tái)運(yùn)行一段代碼時(shí)灸异,打印出的內(nèi)容和返回的內(nèi)容一點(diǎn)關(guān)系都沒(méi)有
  • 第一種方法:具名函數(shù)
 function f(x,y){
     return x+y
 }
 f.name // 'f'
  • 第二種方法:匿名函數(shù)
 var f
 f = function(x,y){
     return x+y
 }
 f.name // 'f'

如果要聲明一個(gè)匿名函數(shù)必須賦值給另外一個(gè)變量

  • 第三種 具名函數(shù)賦值 面試常用到
 var f
 f = function f2(x,y){ return x+y }
 f.name // 'f2'
 console.log(f2) // undefined

如圖府适,黑色的代碼的Y的作用域就在綠色圈圈內(nèi),即使在外面也能訪問(wèn)Y肺樟,下面藍(lán)色的代碼的Y的作用范圍就只能函數(shù)的里面檐春,也就是只能在綠圈圈里面訪問(wèn)Y。這叫做作用的區(qū)域么伯。這兩種語(yǔ)法并沒(méi)有區(qū)別疟暖,所以這就是不一致性,所有的不一致性都是垃圾

  • 第四種 window.Function(不常用)

聲明方式:所有部分都是用字符串表示田柔,字符串可以拼接起來(lái)俐巴,拼接期間可以添加變量

 var f = new Function('x','y','return x+y')
 f.name // "anonymous"
  • 第五種 箭頭函數(shù)
 var f = (x,y) => {
     return x+y
 }
 var sum = (x,y) => x+y
 var n2 = n => n*n
  • 五種函數(shù)聲明方式總結(jié)
img

函數(shù)的name屬性

函數(shù)的name:面試常踩坑

eval命令

eval的作用是,把字符串當(dāng)作代碼執(zhí)行.(少點(diǎn)用)

如何調(diào)用函數(shù) f.call() 執(zhí)行對(duì)象的函數(shù)體

  • f和f.call()
  • f()和f.call()

大部分人都會(huì)用f()調(diào)用函數(shù)硬爆,但是f.call()才是真正的調(diào)用欣舵。f()是一個(gè)語(yǔ)法糖,f.call為硬核玩家摆屯。如果想學(xué)好this,那就必須用f.call().

  • f.call()用法

this 和 arguments

  • f.call(asThis, input1,input2)
    其中 asThis 會(huì)被當(dāng)做 this邻遏,[input1,input2] 會(huì)被當(dāng)做 arguments
function f(){
    'use strict'
    console.log(this)
    console.log(arguments)
    return undefined
}
f.call(1,2,3) // this 為 1,arguments 為 [1,2,3]

禁止使用 f(input1, input2)

  • undefined就是this虐骑,this也就是call()的第一個(gè)參數(shù)
  • this后面的參數(shù)都是arguments
  • JS第一個(gè)參數(shù)為什么是this?

歷史原因:JS之父設(shè)計(jì)JS的時(shí)候?yàn)榱藵M(mǎn)足上司說(shuō)JS語(yǔ)言必須與JAVA語(yǔ)言類(lèi)似的需求准验,而臨時(shí)加了this,來(lái)表示第一個(gè)參數(shù)廷没。

  • 普通模式
  • 嚴(yán)格模式

call stack 調(diào)用棧

每進(jìn)入一次函數(shù)糊饱,就要壓一次stack

什么是Stack Overflow?

比如上面我們求5次颠黎,就要壓5次棧另锋,若是求100次呢滞项?1000次,10000次甚至更多呢夭坪?我們來(lái)試試把棧爆掉:

作用域樹(shù)形圖

  • 當(dāng)我們?cè)谝粋€(gè)函數(shù)里面聲明變量文判,如果找不到這個(gè)變量,就往父級(jí)找室梅。按照語(yǔ)法樹(shù)戏仓,就近原則
  • 我們只能確定變量是哪個(gè)變量,但是不能確定變量的值
  • 只要有一個(gè)函數(shù)亡鼠,就有一個(gè)作用域
  • 作用域面試題:拿到題目先使用變量提升赏殃,把所有的聲明都提升到上面,把所有的執(zhí)行都放到下面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间涵,一起剝皮案震驚了整個(gè)濱河市仁热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勾哩,老刑警劉巖抗蠢,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳幅,居然都是意外死亡物蝙,警方通過(guò)查閱死者的電腦和手機(jī)炎滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)敢艰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人册赛,你說(shuō)我怎么就攤上這事钠导。” “怎么了森瘪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵牡属,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扼睬,道長(zhǎng)逮栅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任窗宇,我火速辦了婚禮措伐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘军俊。我一直安慰自己侥加,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布粪躬。 她就那樣靜靜地躺著担败,像睡著了一般昔穴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上提前,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天吗货,我揣著相機(jī)與錄音,去河邊找鬼狈网。 笑死卿操,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孙援。 我是一名探鬼主播害淤,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拓售!你這毒婦竟也來(lái)了窥摄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤础淤,失蹤者是張志新(化名)和其女友劉穎崭放,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸽凶,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玻侥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片决摧。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凑兰,靈堂內(nèi)的尸體忽然破棺而出掌桩,到底是詐尸還是另有隱情,我是刑警寧澤姑食,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布波岛,位于F島的核電站,受9級(jí)特大地震影響音半,放射性物質(zhì)發(fā)生泄漏则拷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一曹鸠、第九天 我趴在偏房一處隱蔽的房頂上張望煌茬。 院中可真熱鬧,春花似錦物延、人聲如沸宣旱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浑吟。三九已至笙纤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間组力,已是汗流浹背省容。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燎字,地道東北人腥椒。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像候衍,于是被迫代替她去往敵國(guó)和親笼蛛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,788評(píng)論 0 38
  • 函數(shù)是一塊JavaScript代碼,被定義一次妖异,但可執(zhí)行調(diào)用多次惋戏,js中的函數(shù)也是對(duì)象,所以js函數(shù)可以像其他對(duì)象...
    深沉的簡(jiǎn)單閱讀 435評(píng)論 0 4
  • 函數(shù)和對(duì)象 1他膳、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念响逢。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句,而且...
    道無(wú)虛閱讀 4,560評(píng)論 0 5
  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別? 函數(shù)聲明必須有標(biāo)識(shí)符棕孙,也就是常說(shuō)的函數(shù)名舔亭;函數(shù)表達(dá)式可以省略函數(shù)名.函數(shù)聲明...
    Schrodinger的貓閱讀 243評(píng)論 0 0
  • 今天是立冬了,吃餃子了嘛散罕。默默的看著你的微博分歇,多么想直接告訴你傀蓉,嘿欧漱,姑娘,我喜歡你葬燎。當(dāng)然误甚,再一次泄了氣∑拙唬看著你的...
    Mr_Zoul閱讀 469評(píng)論 0 0