美文网首页
进阶3-函数与作用域

进阶3-函数与作用域

作者: 我七 | 来源:发表于2017-07-23 01:07 被阅读0次

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

    函数声明:
    function sayHello(){ console.log('hello') }
    调用:sayName()
    声明不用放到调用前面,声明时候不执行调用时候才执行
    函数表达式:
    var sayName = fimction() { console.log('hello') }
    调用:sayName()
    声明必须放到调用的前面

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

    JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting),也称变量的声明前置。
    函数的声明前置指的是声明的函数会提升到当前作用域的顶部。

    3.arguments 是什么

    类数组对象,在函数内部,可以使用arguments对象获取该函数的所有传入参数

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

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

    在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
    

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

    起到隔离作用,不会产生全局变量污染的问题,形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
    例:
    (function(){ var a=1; var b=2; }) ()

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

    function factor(n){
    if(n===1){
    return 1
    }
    else if(n=== -1){
    return -1
    }
    else if(n=== 0){
    return 0
    }
    return n * factor(n-1)
    }
    调用: factor(5)
    

    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, '男');
        getInfo('小谷', 3);
        getInfo('男');
    
    name: 饥人谷
     age: 2
     sex: 男
    (3) ["饥人谷", 2, "男", callee: function, Symbol(Symbol.iterator): function]
     name valley
     name: 小谷
    age: 3
    sex: undefined
    (2) ["小谷", 3, callee: function, Symbol(Symbol.iterator): function]
     name valley
     name: 男
     age: undefined
     sex: undefined
     ["男", callee: function, Symbol(Symbol.iterator): function]
    name valley
    

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

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

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

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

    输出console.log(a)为undefined,var不是函数前置后,console.log(b)为声明输出为undefined,结果就是undefined

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

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

    function sayName(name)是函数声明可以先写调用再写声明,var sayAge = function(age)是函数表达式,声明必须写在调用前面,而且sayAge(10)前置了输出结果是undefined

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

    var x = 10
    bar() 
    function foo() {
      console.log(x)
    }
    function bar(){
      var x = 30
      foo() // 10
    }
    
    1.
    globalContent ={
    AO:{
    x: 10
    foo: function
    bar: function
    },
    Scope: null
    }
    //声明foo时 得到下面
    foo.[[scope]] = golbalContenxt.AO
    //声明bar时 得到下面
    bar.[[scope]] = golbalContenxt.AO
    2.
    barContext ={
    AO:{
    x: 30
    },
    Scope: bar.[[scope]] //globalConyext.AO
    }
    3.
    调用foo()时,先从bar执行上下文中的AO里找,找不到再从bar的[[scope]]里找,找到后即调用
    fooContext={
    AO:{}
    Scope: foo.[[scope]] //globalContext.AO
    }
    foo里没有var、function。AO活动对象就是空的
    foo.[[scope]] = golbalContenxt.AO
    在自己里面没有找到,就从globalContext里面找,找到x=10, 所以console.log(x)=10
    

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

    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.
    barContext={
    AO{
    x: 30
    foo: function(){}
    },
    Scope: bar.[[scope]]= barContext.AO
    }
    3.
    fooContext={
    AO{}
    Scope: foo.[[Scope]]= barContext.AO
    }
    AO里没有值,foo在bar里,就回到barContext里面找到x: 30,则console.log(x)=30.
    

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

    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.
    barContext={
    AO:{
    x: 30
    匿名: function(){}
    },
    Scope: bar.[[Scope]]= globalContext.AO
    Scope: 匿名.[[scope]]= barlContext.AO
    }
    3.
    匿名Context={
    AO:{}
    Scope: 匿名.[[scope]]= barlContext.AO
    }
    

    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)
    

    输出:

    undefined
    5
    1
    6
    20
    200
    

    分析:

    1. globalContext={
    AO:{
    a: 1
    fn: function
    fn3: function
    }
    }
    
    fn[[scope]]=globalContext.AO
    fn3[[scope]]=globalContext.AO
    
    2.fnContext={
    AO:{
    a: 6
    fn2: function(){}
    },
    Scope: globalContext.AO
    }
    fn2[[scope]]=fnContext.AO
    
    3. fn3Context{
    AO:{},
    Scope: globalContext.AO
    }
    4. fn2Context{
    AO:{},
    Scope: fnContext.AO
    }
    fn(){
     function fn2(){}
     var a
     console.log(a) //  undefined
     a = 5
     console.log(a)  // 5
     a++   // a = 6
     fn3()  //1  赋值globalContext.AO的a=200
     fn2()   //6,赋值fnContext.AO的a=20
     console.log(a) // 20
    }
    

    相关文章

      网友评论

          本文标题:进阶3-函数与作用域

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