task17-函數(shù)

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

函數(shù)聲明,跟變量聲明一樣會(huì)前置屹蚊。

function 函數(shù)名稱(){
    statement;
}

函數(shù)表達(dá)式,只是一個(gè)賦值表達(dá)式坝辫,會(huì)把變量聲明前置。

var 變量名稱 = function(){
    statement;
};
函數(shù)聲明和表達(dá)式區(qū)別

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

聲明前置近忙,就是在一個(gè)作用域塊中,所有的變量都被放在塊的開始出聲明智润。如果有變量聲明和函數(shù)聲明及舍,那么按著他們的先后順序來聲明前置。

arguments 是什么 窟绷?

arguments在JS中是函數(shù)的一個(gè)內(nèi)置對(duì)象锯玛,可以用調(diào)用數(shù)據(jù)的方法來調(diào)用arguments。比如length,還有index方法兼蜈。但是數(shù)組的push和pop對(duì)象是不適用的攘残。可以通過使用argument對(duì)象讓函數(shù)能夠調(diào)用** 數(shù)量不定的參數(shù) **为狸。


參數(shù)數(shù)量定死了的情況

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

嚴(yán)格意義上說歼郭, javascript不支持函數(shù)重載,不能夠定義同樣的函數(shù)然后通過編譯器去根據(jù)不同的參數(shù)執(zhí)行不同的函數(shù)辐棒。因?yàn)镴S只要函數(shù)名稱相同病曾,那么后一個(gè)函數(shù)會(huì)覆蓋前一個(gè)函數(shù)。不過我們可以通過JS自身屬性模擬函數(shù)重載的過程漾根。
arguments是JavaScript里的一個(gè)內(nèi)置對(duì)象泰涂,包含了調(diào)用者傳遞的** 實(shí)際參數(shù) **。arguments具有l(wèi)ength屬性辐怕,是一個(gè)“偽數(shù)組”逼蒙,它存儲(chǔ)的實(shí)際參數(shù)能夠用數(shù)組訪問符[]來訪問,并且是只讀不可寫寄疏。
參數(shù)不同個(gè)數(shù)和參數(shù)不同類型的重載

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

(函數(shù)定義表達(dá)式)函數(shù)調(diào)用表達(dá)式
(function(){ console.log("test");})();

或者

(function(){ console.log("test");}());

作用:創(chuàng)建并執(zhí)行一個(gè)匿名函數(shù)。
立即執(zhí)行函數(shù)原理及使用場(chǎng)景

什么是函數(shù)的作用域鏈赁还?

作用域就是變量與函數(shù)的可訪問范圍妖泄。即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中艘策,變量的作用域有全局作用域和局部作用域兩種蹈胡。
函數(shù)對(duì)象有一個(gè)內(nèi)部屬性[Scope],包含了函數(shù)被創(chuàng)建后的作用域中對(duì)象的集合,這個(gè)集合被稱為函數(shù)的作用域鏈罚渐,它決定了哪些數(shù)據(jù)能被函數(shù)訪問却汉。

如何應(yīng)用作用域鏈:在函數(shù)里面使用頻率較高的外部變量,最好先將外部變量保存為局部變量后荷并,再進(jìn)行操作合砂,這樣就大大減少通過作用域鏈查找變量的時(shí)間。

代碼題
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('hunger', 28, '男'); 
    //name:hunger age:28 sex:男["hunger",28,"男"] name valley
    getInfo('hunger', 28);
//name:hunger age:28 sex:undefined ["hunger",28] name valley 
//name:男 age:undefined sex:undefined ["男"] name valley

2翩伪、寫一個(gè)函數(shù),返回參數(shù)的平方和谈息?如

function sumOfSquares(){
    var sum = 0;
  for(i=0;i<arguments.length;i++){
    sum = sum +arguments[i]*arguments[i];
  }
  console.log(sum);
   }
   sumOfSquares(2,3,4);   // 29
   sumOfSquares(1,3);   // 10

3缘屹、如下代碼的輸出?為什么?

  console.log(a);
   var a = 1;
   console.log(b);

聲明前置后

    var a;
    console.log(a);//undefined
    a = 1;
   console.log(b);//報(bào)錯(cuò)侠仇,不存在

原因:變量聲明提前
4轻姿、如下代碼的輸出?為什么逻炊?

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };

聲明前置后

     function sayName(name){
        console.log('hello ', name);
    }
    var sayAge;
    sayName('world');             //'hello'world
    sayAge = function(age){
        console.log(age);
    };                                  //只是給變量sayAge賦值互亮,沒有輸出

原因:sayAge只聲明未執(zhí)行
5、如下代碼的輸出余素?為什么胳挎?

    function fn(){}
    var fn = 3;
    console.log(fn);

變量前置后

   var fn;                 //聲明fn變量
   function fn(){};   // 聲明函數(shù)fn
   fn = 3;              // 覆蓋函數(shù)fn,fn為變量,賦值為3
   console.log(fn);  //3

其實(shí)若是

     var fn = 3;    
    function fn(){}
    console.log(fn);     //3

原因:當(dāng)函數(shù)執(zhí)行有命名沖突的時(shí)候溺森,函數(shù)執(zhí)行時(shí)載入順序是** 變量慕爬、函數(shù)、參數(shù) **屏积。

覆蓋

6医窿、如下代碼的輸出?為什么炊林?

    function fn(fn2){                                  
       console.log(fn2);                              
       var fn2 = 3;                                          
       console.log(fn2);                                   
       console.log(fn);                                     
       function fn2(){
            console.log('fnnn2');
        }
     }
    fn(10);

函數(shù)內(nèi)部變量前置

  function fn(fn2){
     var fn2 =  10;                 //傳參數(shù)姥卢,給fn2賦值10
    function fn2(){
            console.log('fnnn2');       
 }                                           //覆蓋變量fn2,fn2為函數(shù)
     console.log(fn2);                   //function fn2(){ console.log('fnnn2'); }
     fn2 = 3;
     console.log(fn2);                   //3
      console.log(fn);                    //輸出fn整個(gè)函數(shù)
}
     fn(10);

7渣聚、如下代碼的輸出独榴?為什么 ?

    var fn = 1;
    function fn(fn){ console.log(fn); } 
   console.log(fn(fn));

輸出報(bào)錯(cuò)奕枝,第一行fn為變量棺榔,并賦值。第二行只是聲明了個(gè)函數(shù)隘道,并未執(zhí)行症歇,沒有輸出郎笆。運(yùn)行第三行時(shí),fn是一個(gè)變量忘晤,并非函數(shù)宛蚓,所以報(bào)錯(cuò)。
8设塔、如下代碼的輸出凄吏?為什么 ?

    //作用域
     console.log(j); 
     console.log(i); 
     for(var i=0; i<10; i++){ 
             var j = 100; 
     } 
     console.log(i); 
     console.log(j);

聲明提前后為

     var i ;
     var j;     //if語句是流程控制語句闰蛔,不是函數(shù)痕钢,所以i、j在此為全局變量钞护,聲明前置盖喷。
      console.log(j);  //undefined
      console.log(i)爆办;//undefined
      for(i = 0;i<10;i++){
                var j = 100 ;
    }
     console.log(i);           //10
     console.log(j);           //100

9难咕、如下代碼的輸出?為什么距辆?

    fn();
    var i = 10; 
    var fn = 20; 
    console.log(i); 
    function fn(){ 
              console.log(i); 
              var i = 99; 
              fn2(); 
              console.log(i); 
              function fn2(){ 
                        i = 100;
             } 
     }

聲明前置后為

 var i;
 var fn;
 function fn(){ 
              var i;
              function fn2(){ 
                        i = 100;
             } 
              console.log(i); 
              i = 99; 
              fn2(); 
              console.log(i);  
     }
 fn();           //undefined 100 
 i = 10;       
 fn = 20;
 console.log(i);  //10

10余佃、如下代碼的輸出?為什么?

    var say = 0; 
    (function say(n){ 
      console.log(n);                        //10
     if(n<3) return; 
      say(n-1);                                //9 8 7 6 5 4 3
     }( 10 ));        
     console.log(say);                    //0

原因:立即執(zhí)行函數(shù)內(nèi)跨算,say的作用域和外層變量say的不一樣爆土,所以最后一行執(zhí)行輸出為10。
立即執(zhí)行函數(shù)內(nèi)诸蚕,先傳入?yún)?shù)10步势,運(yùn)行到第三行輸出10。
當(dāng)n>=3時(shí)背犯,傳入?yún)?shù)9/8/7/6/5/4/3后坏瘩,執(zhí)行函數(shù)say輸出9 8 7 6 5 4 3。
當(dāng)n<3漠魏,跳出循環(huán)倔矾。

** 本教程版權(quán)歸博主和饑人谷所有,轉(zhuǎn)載須說明來源柱锹。**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哪自,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子禁熏,更是在濱河造成了極大的恐慌壤巷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧毙,死亡現(xiàn)場(chǎng)離奇詭異隙笆,居然都是意外死亡锌蓄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撑柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘸爽,“玉大人,你說我怎么就攤上這事铅忿〖艟觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵檀训,是天一觀的道長柑潦。 經(jīng)常有香客問我,道長峻凫,這世上最難降的妖魔是什么渗鬼? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荧琼,結(jié)果婚禮上譬胎,老公的妹妹穿的比我還像新娘。我一直安慰自己命锄,他們只是感情好堰乔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脐恩,像睡著了一般镐侯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驶冒,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天苟翻,我揣著相機(jī)與錄音,去河邊找鬼骗污。 笑死崇猫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的身堡。 我是一名探鬼主播邓尤,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贴谎!你這毒婦竟也來了汞扎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤擅这,失蹤者是張志新(化名)和其女友劉穎澈魄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仲翎,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痹扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铛漓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲫构。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浓恶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出结笨,到底是詐尸還是另有隱情包晰,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布炕吸,位于F島的核電站伐憾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赫模。R本人自食惡果不足惜树肃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瀑罗。 院中可真熱鬧胸嘴,春花似錦、人聲如沸廓脆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽停忿。三九已至,卻和暖如春蚊伞,著一層夾襖步出監(jiān)牢的瞬間席赂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工时迫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颅停,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓掠拳,卻偏偏與公主長得像癞揉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溺欧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,237評(píng)論 0 4
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會(huì)率先讀取函數(shù)聲明喊熟,并使其在執(zhí)行任何代碼之前可以訪問;函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 388評(píng)論 0 1
  • 1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 函數(shù)在JS中有三種方式來定義:函數(shù)聲明(function decla...
    進(jìn)擊的阿群閱讀 442評(píng)論 0 1
  • 概念 1姐刁、函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別芥牌? ECMAScript規(guī)定了三種聲明函數(shù)方式: 構(gòu)造函數(shù)首先函數(shù)也是對(duì)象...
    周花花啊閱讀 468評(píng)論 1 1
  • 初二年級(jí)組全體同仁: 公歷6月2日(星期五)17日整,校首屆羽毛球大獎(jiǎng)賽將在白沙洲羽康羽毛球俱樂部(鋁制品廠內(nèi))拉...
    唐紅旗_閱讀 312評(píng)論 0 3