美文网首页
something about JavaScript(2)

something about JavaScript(2)

作者: 来人啊都给朕退下吧 | 来源:发表于2017-07-10 16:38 被阅读18次

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

    函数声明

     //函数声明
      function sayHello(){
        console.log('hello')
      }
    
      //函数调用
      sayHello()
    

    声明不必放到调用的前面

    函数表达式

     var sayHello = function(){
        console.log('hello');
      }
    
      sayHello()
      
    

    声明必须放到调用的前面

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

    声明前置是将变量、函数的声明放此变量、函数所在作用域的开头部分。

    arguments 是什么

    arguments是一个类数组对象。代表传给一个function的参数列表。
    可以在函数内部通过使用 arguments 对象来获取函数的所有参数。这个对象为传递给函数的每个参数建立一个条目,条目的索引号从0开始。它包括了函所要调用的参数。object对象。类数组。

    function printInfo( name, age, sex ){
        console.log( name );
        console.log( age );
        console.log( sex );
        console.log( arguments[0] );    // 打出来的是name
    }
    
    

    函数的"重载"怎样实现

    首先,要明确,在JS中,没有重载。同名函数会覆盖。但可以在函数体针对不同的参数调用执行相应的逻辑。
     
     function printPeopleInfo(name, age, sex){
        if(name){
          console.log(name);
        }
        if(age){
          console.log(age);
        }
        if(sex){
          console.log(sex);
        }
      }
      printPeopleInfo('Byron', 26);//Byron 26
      printPeopleInfo('Byron', 26, 'male');//Byron 26 male  
      
      
    

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

    (function fn1(){
        var  a = 1;
    })()
    

    作用: 隔离作用域。

    JavaScript有很多致命缺陷,比如JavaScript中没有命名空间,而且只有function代码块内部可以隔离变量作用域,自调用匿名函数就用来防止变量弥散到全局,以免各种js库冲突。

    求n!,用递归来实现

    function mul(a) {
    
        if (a < 0)
            return;
        if (a == 0)
            return 1; 
        {
            return a * mul(a - 1);
        }
    }
    
    console.log(mul(5));
    
    //输出结果120
    
    

    一些面试题

    如下代码的输出?为什么

            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, '男');
        getInfo('小谷', 3);
        getInfo('男');
        
        
        
    执行结果:
    getInfo('饥人谷', 2, '男');
    输出: 
    name:  饥人谷
    age: 2
    sex: 男
    {0:'valley', 1: 2, 2: '男'}
    name  valley 
    
    
    getInfo('小谷', 3);
    输出: 
    name: 小谷
    age: 3
    sex: undefined
    {0:'valley', 1: 3}
    name  valley 
    
    
    getInfo('男');
    输出: 
    name: 男
    age: undefined
    sex: undefined
    {0:'valley'}
    name  valley 
    
    
    

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

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

    如下代码的输出?为什么

        console.log(a);
        var a = 1;
        console.log(b);
        
        
    输出结果:undefined
        
            Uncaught ReferenceError: b is not defined
                
     解析:console.log(a)的时候虽然a声明前置,但是并未赋值,所以这时候a的值是undefined,console.log(b)的时候,b没有定义,所以是报错。
        
        
    

    如下代码的输出?为什么

        sayName('world');//hello world  函数声明前置,可以随意调用
        sayAge(10);//报错,因为此函数必须必须在其函数表达式之后调用
        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
    
    调用过程:
    ////
    1. globalContext = {
    
        AO: {
    
            x: 10;
            foo:function
            bar:function
        }
    
        foo.[[scope]] = globalContext.AO
        bar.[[scope]] = globalContext.AO
    
    }
    
    2.调用bar()  barContext = {
    
        AO:{
    
            x:30;
    
        }
        scope:bar.[[scope]] = globalContext.AO
    }
    
    
    3.调用foo() fooContext = {
    
        AO:{}
    
        scope:foo.[[]scope] =globalContext.AO
    
    
    }
    
    
    

    如下代码输出什么? 写出作用域链查找过程伪代码

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      function foo(){
        console.log(x) 
      }
      foo();
    }   
    
    
    运行结果:30
    
    调用过程
    
    ////////////
    
    1. globalContext = {
    
        AO: {
            x: 10;
            bar:function
        }
    
      
        bar.[[scope]] = globalContext.AO
    
    }
    
    2.调用bar()  barContext = {
    
        AO:{
    
            x:30;
            foo:function
    
        }
        scope:bar.[[scope]] = globalContext.AO
        scope:foo.[[scope]] = barContext.AO
    }
    
    
    3.调用foo() fooContext = {
    
        AO:{}
    
        scope:foo.[[]scope] =barContext.AO
    
    
    }
    
    

    以下代码输出什么? 写出作用域链的查找过程伪代码

     
    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      (function (){
        console.log(x)
      })()
    }
    
    
    输出结果:30
    
    
    
    调用过程:
    
    //////
    
    
    1. globalContext = {
    
        AO: {
            x: 10;
            bar:function
        }
    
      
        bar.[[scope]] = globalContext.AO
    
    }
    
    2.调用bar()  barContext = {
    
        AO:{
    
            x:30;
            匿名:function
    
        }
        scope:bar.[[scope]] = globalContext.AO
        scope:匿名.[[scope]] = barContext.AO
    }
    
    
    3.调用匿名函数()   匿名Context = {
    
        AO:{}
    
        scope:匿名函数.[[scope]] =barContext.AO
    
    
    }
    
    
    
    
    

    以下代码输出什么? 写出作用域链查找过程伪代码

    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
    
    
    调用过程:
    ///////
    1. globalContext {
    
        AO: {
            a: 200;
            fn: function
            fn3: function
    
        }
    
        Scope: null;
    
       fn.[[scope]]=globalContext.AO
       fn3.[[scope]]=globalContext.AO
    
    
    }
    
    2. 调用fn() 
    
        fnContext{
          AO:{
            a:20
            fn2:function
          }
    
          fn.[[scope]]=globalContext.AO
          fn2.[[scope]]=fnContext.AO
    
        }
    
    3. 调用fn3()
    
          fn3Context{
            AO:{}
            fn3.[[scope]]=globalContext.AO
          }
    
    4. 调用fn2()
    
          fn2Context{
            AO:{}
            fn2.[[scope]]=fnContext.AO
    
          }
    
    
    
    

    相关文章

      网友评论

          本文标题:something about JavaScript(2)

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