进阶3

作者: 取个名字都不行 | 来源:发表于2017-10-04 19:06 被阅读0次

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

    • .以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的
    • 以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用.
    • 以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明

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

    • 变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,然后给他初始值undefined,然后才逐句执行程序,这就叫做“变量提升”,也即“变量的声明前置”。
    • 函数的声明前置:函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面

    3. arguments 是什么

    arguments 是一个类似数组的对象, 对应于传递给函数的参数。
     arguments对象是函数内部的本地变量;arguments 已经不再是函数的属性了。可以在函数内部通过使用 arguments 对象来获取函数的所有参数。这个对象为传递给函数的每个参数建立一个条目,条目的索引号从0开始。它包括了函所要调用的参数。object对象。类数组。

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

    function printPeopleInfo(name, age, sex){
        if(name){
          console.log(name);
        }
    
        if(age){
          console.log(age);
        }
    
        if(sex){
          console.log(sex);
        }
      }
    

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

    立即执行函数表达式是一种声明和调用同时进行的函数表达式
    作用:隔离作用域,避免声明污染

    (function(){ var a = 1; })()
    (function(){ var a = 1; }())
    /*
    当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明
    */
    

    6.求n!,用递归来实现

    function multiply(n){
        if(n===1 || n===0){
            return 1;
        }
        return n*multiply(n-1);
        if(n<0){
            return false;
        }
    }
    

    7.以下代码输出什么?

        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, '男');
    /*
    name:饥人谷
    age:2
    sex:男
    ['饥人谷',2,'男']
    name valley
    */
    getInfo('小谷', 3);
    /*
    name:小谷
    age:3
    sex:undefined
    ['小谷',3]
    name valley
    */
    getInfo('男');
    /*
    name:男
    age:undefined
    sex:undefined
    ['男']
    name valley
    */
    

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

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

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

        console.log(a);//undefined
        var a = 1;
        console.log(b);//b is not defined,没有b变量的声明
    

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

    sayName('world');//hello world
        sayAge(10);//sayAge(10) is not a function
        function sayName(name){
            console.log('hello ', name);
        }
        var sayAge = function(age){
            console.log(age);
        };
    /*
    由于对于function sayName(name)实用的是函数声明,对于var sayAge = function(age)使用的是函数表达式(函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用)
    */
    

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

    var x = 10
    bar() 
    function foo() {
      console.log(x)
    }
    function bar(){
      var x = 30
      foo()
    }
    /*
    1.
       globalContext = {
          AO:{
             x:10
             foo:function
             bar:function
          },
          Scope:null
       }
       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
        }
        输出10
    */
    

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

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      function foo(){
        console.log(x) 
      }
      foo();
    }
    /*
    1.
    globalContext = {
       AO:{
          x:10
          bar:function
       },
       Scope:null
    }
    bar.[[scope]]=globalContext.AO
    2.调用bar()
    barContext = {
       AO:{
           x:30
          foo:function
       },
       scope:bar.[[scope]]=globalContext.AO
    }
    foo.[[scope]]=barContext.AO
    3.调用foo()
    fooContext = {
       AO:{},
       scope:foo.[[scope]]=barContext.AO
    }
    输出30
    */  
    

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

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      (function (){
        console.log(x)
      })()
      }
    /*
    1.
    globalContext = {
       AO:{
          x:10
          bar:function
       },
       Scope:null
    }
    bar.[[scope]]=globalContext.AO
    2.调用bar()
    barContext = {
       AO:{
           x:30
           function
       },
       scope:bar.[[scope]]=globalContext.AO
    }
    function.[[scope]]=barContext.AO
    3.调用foo()
    functionContext = {
       AO:{},
       scope:function.[[scope]]=barContext.AO
    }
    输出30
    */
    

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

    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)
    /*
    1.
        globalContext = {
            AO:{
                a:1
                fn:function
                fn3:function
            },
            Scope:null
        }
        fn.[[scope]] = globalContext.AO
        fn3.[[scope]] = globalContext.AO
        2.调用fn()
        fnContext = {
            AO:{
                a:undefined
                fn2:function
            },
            Scope:fn.[[scope]] // globalContext.AO
        }
        fn2.[[scope]] = fnContext.AO
        3.调用fn3()
        fn3Context = {
            AO:{
                a:200
            },
            Scope:fn3Context.[[scope]]//globalContext.AO
        }
        fn2ConText = {
            AO:{
                a:20
            },
            Scope:fn2ConText.[[scope]]//fnContext.AO
        }
    首先运行fn(),由于fn()内定义了a所以console.log(a)为undefined,然后a=5,所以console.log(a)为5,a++使a为6,运行fn3(), fn3.[[scope]] = globalContext.AO,故console.log(a)为1然后a=200,使得globalContext.AO中a变成200,运行fn2()由于fn2.[[scope]] = fnContext.AO所以console.log(a)为6,由于a=20是全局定义,使得fnContext.AO中a变成20,console.log(a)变成20.最后运行全局的console.log(a)为200
    所以输出为
    undefined
    5
    1
    6
    20
    200
    */
    

    相关文章

      网友评论

          本文标题:进阶3

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