函数

1. 函数声明和函数表达式有什么区别?

  • 在变量提升或声明提前过程中,函数声明是将整个被定义的函数提前,即该函数可以在任意位置被调用;
    而函数表达式的变量提升则是将函数名作为一个普通参数提前,此时并没有被赋予函数属性,所以只有在被函数表达式赋值后才能调用该函数。、

2. 什么是变量的声明前置?什么是函数的声明前置?

  • 变量的声明前置是指将所声明的变量提升,即表示存在该变量,但此时并没有给这个变量赋值;
    函数的声明前置是指将整个被定义的函数提升,此时这个函数是有意义的,可以被调用的。

3. arguments是什么?

  • arguments的作用是获取函数中的参数并形成一个类数组对象。

4. 函数的重载怎样实现?

  • 通过arguments来实现函数对象数目的变化。

举例:

  •   function getInfo(name, age, sex){
          console.log('name:',name);      //  输出'name:'+name的赋值
          console.log('age:', age);       //  输出'age:'+ age的赋值
          console.log('sex:', sex);       //  输出'sex:'+ sex的赋值
          console.log(arguments);         //  获取参数,形成一个类数组对象
          arguments[0] = 'valley';        //  为数组中第一个参数即'name'重新赋值
          console.log('name', name);      //  输出'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
      getInfo('男');
      // name: 男
      // age: undefined
      // sex: undefined
      // ["男"]
      // name valley
    

###2. 写一个函数,返回参数的平方和?如:
- ```
    function sumOfSquares() {
    }
    sumOfSquares(2,3,4);   // 29
    sumOfSquares(1,3);   // 10

代码如下:

  •   function sumOfSquares(){
          var sum = 0;
          for (var i = 0; i < arguments.length; i++) {
              sum += arguments[i]*arguments[i];
          };
          console.log (sum);
      }
      sumOfSquares(2,3,4);   // 29
      sumOfSquares(1,3);   // 10
    
[代码地址](http://book.jirengu.com/jirengu-inc/jrg-vip9/members/%E7%8E%8B%E5%BA%B7/%E4%BB%BB%E5%8A%A1%E5%8D%81%E4%B8%83%EF%BC%9A%E5%87%BD%E6%95%B0/task17-2.html)

###3. 如下代码的输出?为什么?
- ```
    console.log(a);     // undefined
    var a = 1;
    console.log(b);     // Uncaught ReferenceError: b is not defined
  • 由于变量提升,且变量a的赋值在语句console.log(a)之后,故console.log(a)输出为undefined
    因为b为被定义,故浏览器报错。

4. 如下代码的输出?为什么?

  •   sayName('world');   // hello world
      sayAge(10);         // Uncaught TypeError: sayAge is not a function
      function sayName(name){
          console.log('hello ', name);
      }
      var sayAge = function(age){
          console.log(age);
      };
    
- 函数声明提升是把整个被定义的函数提升,故第一行```sayName('world'); ```执行时函数```sayName()```可被调用;
但函数表达式的声明提前只是把函数名作为一个普通变量提升,故```sayAge(10);```执行时```sayAge```只是一个普通变量,故将其作为函数调用会使浏览器报错。

###5. 如下代码的输出?为什么?
- ```
    function fn(){}
    var fn = 3;
    console.log(fn);    // 3
  • 变量提升或声明提前后按照执行顺序代码如下:
  •   function fn(){}
      var fn;
      fn = 3;
      console.log(fn);
    
故输出结果为```3```。

###6. 如下代码的输出?为什么?
- ```
    function fn(fn2){
       console.log(fn2);
       var fn2 = 3;
       console.log(fn2);
       console.log(fn);
       function fn2(){
            console.log('fnnn2');
        }
     }
    fn(10);
    // fn2(){
    //         console.log('fnnn2');
    //     }
    // 3
    // fn(fn2){
    //    console.log(fn2);
    //    var fn2 = 3;
    //    console.log(fn2);
    //    console.log(fn);
    //    function fn2(){
    //         console.log('fnnn2');
    //     }
    //  }

函数fn()根据声明提前等规则可以变换为:

  •   function fn(fn2){
          var fn2;
          function fn2(){
              console.log('fnnn2');
          }
         console.log(fn2);        // 语句1
         fn2 = 3;
         console.log(fn2);        // 语句2
         console.log(fn);         // 语句3
       }
      fn(10);
    
所以语句1输出为函数```fn2()```,语句2执行时```fn2=3```,故输出3,语句3输出函数```fn(fn2)```。

###7. 如下代码的输出?为什么?
- ```
    var fn = 1;
    function fn(fn){
        console.log(fn);
    }
    console.log(fn(fn));    // Uncaught TypeError: fn is not a function

按照变量提升或声明提前可变换为:

  •   var fn ;
      function fn(fn){
          console.log(fn);
      }
      fn = 1;
      console.log(fn(fn));
    
所以在执行```console.log(fn(fn));```语句时,```fn```的数据类型为数值,故浏览器报错。

###8. 如下代码的输出?为什么?
- ```
    console.log(j);         // undefined
    console.log(i);         // undefined
    for(var i=0; i<10; i++){
        var j = 100;
    }
    console.log(i);         // 10
    console.log(j);         // 100

变量提升或声明提前后,代码变为:

  •   var i;
      var j;
      console.log(j);
      console.log(i);
      for(i=0; i<10; i++){
          j = 100;
      }
      console.log(i);
      console.log(j);
    
当```for```循环之后,```i```的值为10,```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();
      i = 10;
      fn = 20;
      console.log(i);
      // undefined
      // 100
      // 10
    

###10. 如下代码的输出?为什么?
- ```
    var say = 0;
    (function say(n){
        console.log(n);     // 10 9 8 7 6 5 4 3 2
        if(n<3) return;
        say(n-1);
    }( 10 ));
    console.log(say);       // 0

变量提升或声明提前后,代码变为:

  •   var say;
      function say(n){
          console.log(n);     
          if(n<3) return;
          say(n-1);
      };
      say = 0;
      (function say(n){
          console.log(n);     
          if(n<3) return;
          say(n-1);
      }( 10 ));
      console.log(say);
    
立即调用函数使得```say()```在被调用时不会被```say = 0```覆盖,同时也不会影响全局变量```say = 0```。

***
此教程版权归本人和饥人谷所有,转载需注明来源。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 385评论 0 1
  • 1.函数声明和函数表达式有什么区别 (*) 区别: 函数声明后面的分号可加可不加,不加也不影响接下来语句的执行,但...
    Sheldon_Yee阅读 396评论 0 1
  • 问答题 函数声明和函数表达式有什么区别 (*)答://函数声明function hello(){ conso...
    饥人谷_桶饭阅读 243评论 0 0
  • 问答 函数声明和函数表达式有什么区别?函数声明用指定的参数声明一个函数,必须有函数名称,可在函数声明之前使用函数 ...
    叮叮当当叮叮叮阅读 185评论 0 0
  • 一、针对某类症状的食物 1、【五种食物吃掉黑眼圈】:①鸡蛋:富含优质蛋白,促进细胞再生,缓解黑眼圈;②芝麻:富含对...
    潇湘妃子JC阅读 507评论 0 1