進(jìn)階任務(wù)-3

函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別

//函數(shù)聲明
function test1(){}
//函數(shù)表達(dá)式
var test2 = function(){}

函數(shù)聲明可以在在代碼中任意位置調(diào)用任内,但是函數(shù)表達(dá)式只能在表達(dá)式語句后面調(diào)用

什么是變量的聲明前置?什么是函數(shù)的聲明前置

聲明變量后融柬,變量提升到其所處作用域的頂部
console.log(a)//undefined 其實(shí)a已經(jīng)前置了死嗦,只不過還沒有賦值
var a = 5

函數(shù)的聲明前置,提升到其所處作用域的頂部
fn()//調(diào)用雖然在前面粒氧,但是函數(shù)聲明的方法已經(jīng)提升到頂部了越除,就能讓調(diào)用正常運(yùn)行
function fn() {}

如果用了函數(shù)表達(dá)式,那就不能在隨意位置調(diào)用了
fn()//報(bào)錯(cuò)外盯!
var fn = function() {}//此時(shí)的fn身份只是一個(gè)變量值摘盆,這個(gè)時(shí)候在它之前調(diào)用就會(huì)報(bào)錯(cuò)啦

arguments 是什么

是一個(gè)類數(shù)組對象,它包含了函數(shù)中的所有實(shí)際參數(shù)饱苟。

function foo(a,b) {
console.log(arguments);
}
foo(1,2);//[1, 2]

函數(shù)的"重載"怎樣實(shí)現(xiàn)

其他語言能實(shí)現(xiàn)的“重載”寫法在js這兒是行不通的骡澈,因?yàn)橥暮瘮?shù)會(huì)被覆蓋掉,但是也不是一點(diǎn)兒辦法也沒有掷空,我們可以通過對函數(shù)傳入的參數(shù)進(jìn)行判斷,來實(shí)現(xiàn)同一方法的囤锉,不同處理坦弟,得到不同的結(jié)果,達(dá)到重載的目的官地。

//舉個(gè)栗子
function animals(dog,cat,pig){
  if(dog){
    console.log(' This is a dog ')
  }
  if(cat){
    console.log(' This is a cat ')
  }
  if(pig){
   console.log(' This is a pig ')
  }
}

立即執(zhí)行函數(shù)表達(dá)式是什么酿傍?有什么作用

作用:隔離作用域,避免變量污染全局驱入,將函數(shù)按表達(dá)式的方法寫赤炒,也可達(dá)到這個(gè)效果

(function fn1(){}) ()

求n!,用遞歸來實(shí)現(xiàn)

//遞歸亏较,寫個(gè)方法莺褒,自己調(diào)用自己,就叫遞歸
function recursion(n){
    if(typeof n !='number'){
        console.log('請輸入數(shù)字')
        return
    }
    else if(n===0){
        console.log('不能輸入0的啊')
        return
    }
    else if(n===1){
        return 1
    }
    else{
        return n * recursion(n-1)
    }
}

以下代碼輸出什么雪情?

function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }

    getInfo('饑人谷', 2, '男'); //name:饑人谷 age:2 sex:男 ['饑人谷',2,'sex'] name valley 
    getInfo('小谷', 3); //name:小谷遵岩、age:3、undefined、['小谷', 3]尘执、name vally;
    getInfo('男'); //name:男舍哄、undefined、undefined誊锭、['男']表悬、name vally;

寫一個(gè)函數(shù),返回參數(shù)的平方和丧靡?

function sumOfSquare(){
    result = 0
    for(var i =0;i<arguments.length;i++){
        result = result + arguments[i]*arguments[i]
    }
    return result
}
console.clear()
console.log(sumOfSquare(5,5))//50

如下代碼的輸出?為什么

console.log(a);//變量提升的原因窘行,讀到了代碼,但是輸出早了沒來得及給值但绕,所以是undefined
var a = 1;
console.log(b);//這個(gè)b壓根兒就不存在惶看,所以就是b is not defined

如下代碼的輸出?為什么

sayName('world');//hello,world,變量提升幅骄,隨意調(diào)用拆座,都可得值
sayAge(10);//sayAge is not a function冠息,表達(dá)式的寫法,使這個(gè)方法只能以“值”的形式存在躏碳,沒有“提升”的特權(quán)散怖,所以此時(shí)的調(diào)用就報(bào)錯(cuò)
function sayName(name){
        console.log('hello ', name);
    }
var sayAge = function(age){
        console.log(age);
    }

如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}
//輸出10
偽代碼展示
// 變量提升镇眷,激活上下文之后等同于:
var x = 10 
function foo() {
  console.log(x)
} 
bar() 
// 最后輸出10

我的想法:這兩個(gè)方法是沒有包含和被包含關(guān)系的,都是一旦被激活丹诀,先找自己方法內(nèi)的小范圍,如果找不到就順延著去全局找去硝桩,不要因?yàn)閒oo方法在bar范圍內(nèi)激活的就認(rèn)為這兩個(gè)方法有包含從屬關(guān)系

如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}
//輸出30  
偽代碼展示
// 變量提升碗脊,激活上下文之后等同于:
  var x = 30;
  function foo(){
    console.log(x) 
  }

我的想法:上面一題那種寫法橄妆,兩個(gè)方法是沒有 從屬包含 關(guān)系的,但是這一題的寫法是有 從屬包含關(guān)系的矢劲,主要的不同點(diǎn)在與foo方法的循跡范圍出現(xiàn)了變化 它找東西的過程是這樣的 先找自己范圍內(nèi)的慌随,若沒有,找bar方法有沒有丸逸,若bar方法沒有剃袍,馬上就去全局去找去,這個(gè)是與上一題最大的不同

以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼

var x = 10;
bar() 
function bar(){
  var x = 30;
  (function (){
    console.log(x)
  })()
}
//輸出30
偽代碼展示
// 變量提升憔维,激活上下文之后等同于:
  var x = 30;
 (function (){
    console.log(x)
  })()

以下代碼輸出什么埋同? 寫出作用域鏈查找過程偽代碼

var a = 1;
function fn(){
  console.log(a)
  var a = 5
  console.log(a)
  a++
  var a
  fn3()
  fn2()
  console.log(a)

  function fn2(){
    console.log(a)
    a = 20
  }
}

function fn3(){
  console.log(a)
  a = 200
}

fn()
console.log(a)
//依次輸出 undefined,5,1,6,20.200 

全局范圍內(nèi)瀏覽器讀碼讀到了什么
a = 1
名為 fn 的方法
名為 fn3 的方法

當(dāng)讀到fn()時(shí)會(huì)激活fn方法 開始fn函數(shù)的上下文,fn里面讀到了什么
a = undefined
名為 fn2 的方法
console.log(a) // 第一次輸出undefined
a = 5
console.log(a) //第二次輸出 5
a++ //此時(shí)在fn方法中a為6

當(dāng)讀到fn3()時(shí)激活fn3的上下文咧栗,看看fn3里面有點(diǎn)兒啥
瀏覽器第一遍讀碼會(huì)發(fā)現(xiàn)這個(gè)里面沒有可提升的東西,
第二遍讀碼交煞,如果要輸出a就得去全局中去找a,此時(shí)全局中的a
為1 所以第三次輸出1斟或,讀到a = 200時(shí),就把全局中的a=1
改成a=200御毅,此時(shí)全局的a值由開始時(shí)的1變成了200

讀完fn3之后,會(huì)激活fn2方法的上下文端蛆,然后看看fn2里面,能讀到什么
瀏覽器進(jìn)入fn2后第一遍讀碼發(fā)現(xiàn)沒有可提升的東西嫌拣,接著第二遍讀碼呆躲,輸出a,fn2的范圍里沒有a灰瞻,便去fn里面找a去燥筷,此時(shí)fn方法里面的a為6然后第四次輸出6,讀到a = 20時(shí)袍祖,就把fn方法里面的a=6改成a=20

把fn2里面的東西都讀完了蕉陋,就該接著讀fn2()下面的代碼了拨扶,讀到console.log(a),此時(shí)fn里面的a值已經(jīng)是20啦缩举,所以現(xiàn)在第五次輸出20匹颤,到這一步,fn里面的東西都已經(jīng)讀完了辽慕,也代表著全局里面的fn()方法折騰完了赦肃。

接著讀fn()方法后面的代碼console.log(a)公浪,接著就得輸出全局中的a此時(shí)a的值為200 所以 第六次輸出就是200啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欠气,一起剝皮案震驚了整個(gè)濱河市晃琳,隨后出現(xiàn)的幾起案子琐鲁,更是在濱河造成了極大的恐慌,老刑警劉巖顾翼,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适贸,死亡現(xiàn)場離奇詭異涝桅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蕊肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門壁却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸准,“玉大人,你說我怎么就攤上這事盐肃∪ㄎ颍” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拇派。 經(jīng)常有香客問我,道長件豌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任骡显,我火速辦了婚禮惫谤,結(jié)果婚禮上珠洗,老公的妹妹穿的比我還像新娘。我一直安慰自己蝴猪,他們只是感情好膊爪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布米酬。 她就那樣靜靜地躺著,像睡著了一般淮逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哼丈,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天筛严,我揣著相機(jī)與錄音,去河邊找鬼车胡。 笑死照瘾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析命。 我是一名探鬼主播逃默,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼完域,長吁一口氣:“原來是場噩夢啊……” “哼瘩将!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姿现,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤建钥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泽艘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镐依,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年然低,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雳攘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫笛。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喧兄,靈堂內(nèi)的尸體忽然破棺而出啊楚,到底是詐尸還是另有隱情,我是刑警寧澤拯辙,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布颜价,位于F島的核電站饵较,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏横辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一困肩、第九天 我趴在偏房一處隱蔽的房頂上張望脆侮。 院中可真熱鬧,春花似錦潭枣、人聲如沸幻捏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榛臼。三九已至,卻和暖如春沛善,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迷捧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工胀葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庆锦。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓搂抒,卻偏偏與公主長得像艇搀,于是被迫代替她去往敵國和親求晶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 1,函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明是使用function關(guān)鍵字聲明一個(gè)函數(shù)矩屁,聲明可以不必放在調(diào)用前面爵赵。 ...
    饑人谷_一葉之秋閱讀 69評論 0 0
  • 任務(wù) 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別答:函數(shù)聲明:function functionName(){}??函數(shù)表達(dá)式...
    mhy_web閱讀 416評論 0 0
  • 一:函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別 函數(shù)聲明必須帶有標(biāo)示符(Identifier)(即函數(shù)名稱)烁峭,而函數(shù)表達(dá)式則可以省...
    osborne閱讀 230評論 0 0
  • 1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 函數(shù)聲明:聲明不必放到調(diào)用的前面约郁; 函數(shù)表達(dá)式:聲明必須放到調(diào)用的前面但两,因?yàn)?..
    cheneyzhangch閱讀 228評論 0 0
  • 貪食而歸,腹便便己肮,抹唇笑看悲关。 雨意莽莽,難得手寓辱,束足不敢。 云端盡頭诱鞠,些許燦爛,經(jīng)得住幾人闌珊这敬? 古成王敗寇,今恩...
    Jims先生閱讀 453評論 3 6