任務(wù)17-函數(shù)

問答題

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

    //函數(shù)聲明
    function hello(){
        console.log("hello world");
    }
    
    //函數(shù)表達(dá)式
    var hello = function(){
        console.log("hello world");
    }
    
    

    兩種方式都能聲明函數(shù)榴芳,但是函數(shù)聲明的寫法會(huì)將函數(shù)前置算柳,可以在全局種任何地方調(diào)用函數(shù)痪宰;但是表達(dá)式只能前置sayHi變量,如果在表達(dá)式之前調(diào)用函數(shù)則會(huì)報(bào)錯(cuò),只能放在表達(dá)式后面進(jìn)行調(diào)用。

  • 什么是變量的聲明前置何址?什么是函數(shù)的聲明前置 (**)
    答:

    • 變量的聲明前置:變量聲明都會(huì)被放在代碼的頭部,只提升變量的聲明并不會(huì)進(jìn)行賦值械念。
    //全局中定義變量
    var a = 1;
    var b = 2;
    //實(shí)際是執(zhí)行起來是這樣的
    var a;
    var b;
    a = 1;
    b = 2;
    
    //函數(shù)中
    function say(){
        var a = 1;
        console.log(a);
        var b = 2;
    }
    //實(shí)際運(yùn)行過程
    function say(){
        var a;
        var b;
        a = 1;
        console.log(a);
        b = 2;
    }
    
    • 函數(shù)聲明前置:函數(shù)的聲明前置和變量聲明一樣头朱,會(huì)提升到代碼頭部。但是會(huì)提升到變量聲明后面龄减,所以可以在函數(shù)聲明前面調(diào)用函數(shù)项钮。
     f(10);//10     此時(shí)該函數(shù)是有效的,且結(jié)果正確
    function f(num){
        console.log(num);
    }
    

    相當(dāng)于

    function f(num){
       cconsole.log(num);
    }
    f(10);
    
  • arguments 是什么 (*)
    答:
    Arguments是個(gè)類似數(shù)組但不是數(shù)組的對(duì)象希停,說他類似數(shù)組是因?yàn)槠渚邆鋽?shù)組相同的訪問性質(zhì)及方式烁巫,能夠由arguments[n]來訪問對(duì)應(yīng)的單個(gè)參數(shù)的值,并擁有數(shù)組長(zhǎng)度屬性length宠能。還有就是arguments對(duì)象存儲(chǔ)的是實(shí)際 傳遞給函數(shù)的參數(shù)亚隙,而不局限于函數(shù)聲明所定義的參數(shù)列表,而且不能顯式創(chuàng)建 arguments 對(duì)象违崇。


    Paste_Image.png

    arguments對(duì)象的長(zhǎng)度是由實(shí)參決定的阿弃。

  • 函數(shù)的重載怎樣實(shí)現(xiàn) (**)
    答:
    在JavaScript中沒有函數(shù)重載的概念,函數(shù)通過名字確定唯一性羞延,參數(shù)不同也被認(rèn)為是相同的函數(shù)渣淳,后面的覆蓋前面的。函數(shù)調(diào)用沒必要把所有參數(shù)都傳入伴箩,只要你函數(shù)體內(nèi)做好處理就行入愧,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)。


    Paste_Image.png
  • 立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用 (***)
    答:

    (function(){
        //第一種
    })();
    
    (function(){
        //第二種
    }());
    

    作用是:立即執(zhí)行函數(shù)可以避免函數(shù)內(nèi)的變量暴露在全局環(huán)境下棺蛛,避免全局變量的污染怔蚌。可以令其函數(shù)中聲明的變量繞過JavaScript的變量置頂聲明規(guī)則旁赊,還可以避免新的變量被解釋成全局變量或函數(shù)名占用全局變量名的情況桦踊,在函數(shù)內(nèi)部?jī)?nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無法讀取的私有變量终畅。

  • 什么是函數(shù)的作用域鏈 (****)
    答:
    在一個(gè)函數(shù)執(zhí)行過程中如果某個(gè)變量在該函數(shù)自己的作用域中沒有钞钙,那么它會(huì)尋找父級(jí)的作用域,直到全局作用域声离,這樣就形成了一個(gè)作用域鏈。


    Paste_Image.png

    執(zhí)行ss()時(shí)瘫怜,作用域鏈?zhǔn)牵?ss()->t()->window,所以name是”桶飯"

代碼題

  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, '男');
    getInfo('hunger', 28);
    getInfo('男');
    

輸出結(jié)果:


Paste_Image.png

形參和實(shí)參的數(shù)量可以不一樣,用arguments可以改變實(shí)參的值鲸湃。

  1. 寫一個(gè)函數(shù)赠涮,返回參數(shù)的平方和?如 (難度**)

       function sumOfSquares(){
       var num;
       for(var i = 0;i<arguments.length;i++){
         
         num = num+arguments[i]*arguments[i];
       }
      return num;
       
    }
     sumOfSquares(2,3,4);   // 29
     sumOfSquares(1,3);
    
  2. 如下代碼的輸出暗挑?為什么 (難度*)

    console.log(a);
    var a = 1;
    console.log(b);
    
    //運(yùn)算過程
    var a;
    console.log(a);//輸出undefined笋除,因?yàn)樽兞刻嵘瑫?huì)把變量a的聲明提升到console.log(a);之前炸裆,當(dāng)console.log(a);執(zhí)行的時(shí)候垃它,變量a還沒有被賦值,所以console.log(a);輸出undefined烹看。
    a = 1;
    console.log(b);//報(bào)錯(cuò)国拇,因?yàn)闆]有變量b。
    

    輸出結(jié)果:

Paste_Image.png
  1. 如下代碼的輸出惯殊?為什么 (難度*)

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
    
    //運(yùn)算過程
    //在執(zhí)行上面代碼的時(shí)候會(huì)將函數(shù)的聲明前置酱吝,而函數(shù)表達(dá)式只會(huì)將變量的聲明前置,函數(shù)不會(huì)前置土思。實(shí)際上述代碼在執(zhí)行的時(shí)候會(huì)變成這樣:
    var sayAge;
    function sayName(name){
        console.log('hello ', name);
    }
    sayName('world');
    sayAge(10);//sayAge(10);的時(shí)候务热,sayAge只是個(gè)變量不是函數(shù),所以會(huì)報(bào)錯(cuò)己儒。最終會(huì)輸出hello world和報(bào)錯(cuò)崎岂。
    sayAge = function(age){
        console.log(age);
    };
    
    
    Paste_Image.png
  2. 如下代碼的輸出?為什么 (難度**)

    function fn(){}
        var fn = 3;
        console.log(fn);//輸出3
        //當(dāng)在同一個(gè)作用域內(nèi)定義了名字相同的變量和方法的話址愿,無論其順序如何该镣,變量的賦值會(huì)覆蓋方法的賦值。
    
  3. 如下代碼的輸出?為什么 (難度***)

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

輸出:


Paste_Image.png
   //過程
   function fn(fn2){
   
   var fn2;//變量聲明前置
   function fn2(){
         console.log('fnnn2');
     }//函數(shù)聲明前置
   console.log(fn2);//log fn2()函數(shù)
   fn2 = 3;//賦值
   console.log(fn2);//log fn2  此時(shí) fn2是3
   console.log(fn);//此作用域找不到 fn损合,向上尋找打印 fn 函數(shù)
   
   }
   fn(10);
   //函數(shù)執(zhí)行命名有沖突的時(shí)候省艳,函數(shù)執(zhí)行載入順序是變量、函數(shù)嫁审、參數(shù)
   ```

7. 如下代碼的輸出跋炕?為什么 (難度***)

   ```
   var fn = 1;
   function fn(fn){
       console.log(fn);
   }
   console.log(fn(fn)); 
   ```
   輸出:
   ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-ab080b605e1f5adb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

   因?yàn)榻o變量聲明進(jìn)行賦值操作后,同名的變量聲明的優(yōu)先級(jí)會(huì)大于同名函數(shù)聲明律适,會(huì)覆蓋同名的函數(shù)聲明辐烂,所以fn現(xiàn)在是一個(gè)變量不是函數(shù),執(zhí)行函數(shù)fn就會(huì)報(bào)錯(cuò)捂贿。

8. 如下代碼的輸出纠修?為什么 (難度**)

   ```
   //作用域
   console.log(j);//輸出undefined,因?yàn)樽兞柯暶髑爸贸琲這時(shí)候還沒有賦值扣草。
   console.log(i);//輸出undefined,因?yàn)樽兞柯暶髑爸醚胀溃琷這時(shí)候還沒有賦值辰妙。
   for(var i=0; i<10; i++){
      var j = 100;
   }
   console.log(i);//輸出10,因?yàn)閒or循環(huán)語(yǔ)句結(jié)束循環(huán)時(shí)甫窟,i的值是10 密浑。
   console.log(j);//輸出100,應(yīng)為變量j的值是100粗井。
   ```
   輸出:
   ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-dad462fcdf2280d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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);// 輸出undefined,因?yàn)樽兞縤的聲明前置浇衬,但還沒有賦值呆瞻。
      i = 99;
      fn2();//執(zhí)行函數(shù)fn2,因?yàn)楹瘮?shù)中的變量i沒有加關(guān)鍵字var径玖,所以它是一個(gè)全局變量,它會(huì)把100賦值到函數(shù)fn的變量i痴脾。這時(shí)i=100
      console.log(i);//輸出100,因?yàn)樽兞縤的值為100梳星。
   }
   fn();
   i = 10;
   fn = 20;
   console.log(i);//輸出10赞赖,因?yàn)樽詈笞兞縤的值是10。
   ```
   ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-a755443ab6d14c20.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

10. 如下代碼的輸出冤灾?為什么 (難度*****)

   ```
   var say = 0;
   (function say(n){ //立即執(zhí)行函數(shù)前域,給函數(shù)初始的參數(shù)n=10,當(dāng)滿足n<3時(shí)韵吨,執(zhí)行say(n-1)匿垄。
      console.log(n);//輸出10,9,8,7,6,5,4,3,2,因?yàn)楫?dāng)n=2時(shí),函數(shù)return椿疗。
      if(n<3) return;
      say(n-1);
   }( 10 ));
   console.log(say);//輸出0.因?yàn)榱⒓磮?zhí)行函數(shù)say(n)相當(dāng)于創(chuàng)造了一塊私有的作用域漏峰,函數(shù)say(n)內(nèi)部可以訪問外部的變量,而外部環(huán)境不能訪問函數(shù)say(n)內(nèi)部的變量届榄,內(nèi)部定義的變量不會(huì)和外部的變量發(fā)生沖突浅乔,所以變量say一直等于0。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铝条,一起剝皮案震驚了整個(gè)濱河市靖苇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌班缰,老刑警劉巖贤壁,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸潦,死亡現(xiàn)場(chǎng)離奇詭異溉旋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)并淋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門给梅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人双揪,你說我怎么就攤上這事动羽。” “怎么了渔期?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵运吓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疯趟,道長(zhǎng)拘哨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任信峻,我火速辦了婚禮倦青,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盹舞。我一直安慰自己产镐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布踢步。 她就那樣靜靜地躺著癣亚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪获印。 梳的紋絲不亂的頭發(fā)上述雾,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼玻孟。 笑死唆缴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的取募。 我是一名探鬼主播琐谤,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼玩敏!你這毒婦竟也來了斗忌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤旺聚,失蹤者是張志新(化名)和其女友劉穎织阳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砰粹,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唧躲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碱璃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄痹。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌器,靈堂內(nèi)的尸體忽然破棺而出肛真,到底是詐尸還是另有隱情,我是刑警寧澤爽航,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布蚓让,位于F島的核電站,受9級(jí)特大地震影響讥珍,放射性物質(zhì)發(fā)生泄漏历极。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一衷佃、第九天 我趴在偏房一處隱蔽的房頂上張望趟卸。 院中可真熱鬧,春花似錦氏义、人聲如沸衰腌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)右蕊。三九已至,卻和暖如春吮螺,著一層夾襖步出監(jiān)牢的瞬間饶囚,已是汗流浹背帕翻。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萝风,地道東北人嘀掸。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像规惰,于是被迫代替她去往敵國(guó)和親睬塌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • 1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 函數(shù)聲明 函數(shù)表達(dá)式 函數(shù)聲明:函數(shù)調(diào)用可以發(fā)生在函數(shù)聲明之前,例如下...
    TimeLesser閱讀 393評(píng)論 4 4
  • 問答: 1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*) 在日常的任務(wù)中歇万,JavaScript主要使用下面兩種方式創(chuàng)建...
    小木子2016閱讀 316評(píng)論 0 0
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會(huì)率先讀取函數(shù)聲明揩晴,并使其在執(zhí)行任何代碼之前可以訪問;函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 385評(píng)論 0 1
  • 1.函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別贪磺? 在ECMAScript中硫兰,創(chuàng)建函數(shù)的最常用的兩個(gè)方法是函數(shù)表達(dá)式和函數(shù)聲明,兩者...
    GarenWang閱讀 528評(píng)論 0 0
  • 關(guān)于模仿 看到這個(gè)詞寒锚,你的第一反應(yīng)是什么劫映? 反感? 厭惡刹前? 嗤之以鼻泳赋? 冷靜下來!思考一下喇喉,哪個(gè)人能離開這個(gè)詞祖今? ...
    淡定的小孩兒閱讀 202評(píng)論 0 2