美文网首页
js之函数

js之函数

作者: 车万里 | 来源:发表于2016-10-31 00:45 被阅读0次

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

    函数声明:

    function functionName(){
        statement;
    }
    

    使用function关键字声明一个函数
    函数表达式:

    var printName = function(){
        console.log('Byron');
    };
    

    声明一个变量赋值其为函数

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

    变量的声明前置:先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部
    函数的声明前置:和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样,如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用。

    3.arguments 是什么

    arguments可以获取到该函数的所有传入参数

    function printPersonInfo(name, age, sex){
        console.log(name);
        console.log(age);
        console.log(sex);
        console.log(arguments);
    }
    

    4.函数的重载怎样实现

    在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的

    5.立即执行函数表达式是什么?有什么作用

    //方法1
    ( function() {
    }() );
    
    //方法2
    ( function() {
    } )();
    

    作用:创建一个独立的作用域,外面访问不到变量,避免污染

    6、什么是函数的作用域链

    任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
    1.全局作用域
     在代码中任何地方都能访问到的对象拥有全局作用域
    2.局部作用域
    和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域
    作用域链
    当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象,如果当前环境没有,就依次访问上一级变量。

    代码

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

    2.写一个函数,返回参数的平方和?如

    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
    

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

    console.log(a); //undefined;
    var a = 1;
     console.log(b);//报错
    

    声明(var)会被前置,所以a是undefined,而b未被声明,所以报错。

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

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

    因为声明和定义函数会前置,可转换为

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

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

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

    可转化为

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

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

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

    可转化为

    function fn(fn2){ 
      var fn2//声明提前
      function fn2(){
         console.log('fnnn2');
      }//函数定义提前
      console.log(fn2); //打印fn2这一函数
       fn2 = 3;
      console.log(fn2); //3
      console.log(fn);//打印fn函数
     
     }
     fn(10);
    

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

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

    等同于

    var fn; 
    function fn(fn){ 
        console.log(fn);
     }
    fn = 1//fn变成了1
     console.log(fn(fn));//fn 不是函数,报错
    

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

     //作用域 
    console.log(j);
     console.log(i);
     for(var i=0; i<10; i++){ 
        var j = 100;
     }
     console.log(i);
     console.log(j);
    
    undefined;
    undefined;//i和j都未定义
    10;//for循环的声明都是全局变量
    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;
        }
    }
    
    undefined;
    100;
    10;
    
    

    等同于

    var i;
    var fn;
    function fn(){
        var i;//声明前置
         function fn2(){
           i = 100;
          }//函数定义前置
        console.log(i); //i未定义
         i = 99;
        fn2();//i变成100
        console.log(i);//100
       
        }
     fn(); //执行函数
     i = 10;//i变成10
     fn = 20;
    console.log(i);10
    
    

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

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

    代码等同于

    var say;
    (function say(n){
      console.log(n); 
      if(n<3) 
      return; 
      say(n-1); 
      }( 10 ));//函数立即执行,n初始值为10,循环直到n等于2停止
    say = 0;
     console.log(say);//0
    

    相关文章

      网友评论

          本文标题:js之函数

          本文链接:https://www.haomeiwen.com/subject/lciuuttx.html