美文网首页
函数与作用域

函数与作用域

作者: Taaaaaaaurus | 来源:发表于2017-07-24 11:12 被阅读0次

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

    • 函数声明
      使用function关键字声明一个函数
    function sayHello {
       console.log('hello')
    }
    
    • 函数表达式
    var sayHello = function (){
       console.log('hello')
    }
    
    • 使用函数表达式来声明函数时,声明必须写在调用的前面;他们的作用域链不相同,函数表达式是全局作用域

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

    代码在电脑中编译的过程是:
    1.先检测整段代码中变量的声明和函数声明语句,执行这些语句
    2.然后按照从上到的顺序执行函数调用语句或其他语句
    3.最后执行变量的赋值
    上述过程中,第一步叫做变量和函数的声明前置

    arguments 是什么

    arguments对象用于获取到该函数的所有传入参数,arguments对象是所有函数中可用的局部变量。可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。

    函数的"重载"怎样实现

    function printPeopleInfo(name, age, sex){
        if(name){
          console.log(name);
        }
    
        if(age){
          console.log(age);
        }
    
        if(sex){
          console.log(sex);
        }
      }
    
    
      printPeopleInfo('Byron', 26);
      printPeopleInfo('Byron', 26, 'male');
    

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

    • 立即执行函数可以在函数声明的同时立即执行,从而隔离作用域,防止函数内变量污染全局
    (function(){
      var a  = 1;
    })()
    console.log(a); //undefined
    

    其他写法

    (function fn1() {} ());
    // 在数组初始化器内只能是表达式
    [function fn2() {} ()];
    // 逗号也只能操作表达式
    1, function fn3() {} ();
    !function fn4() {} ();
    (function fn5() {}) ();
    

    求n!,用递归来实现

    function factor(n){
       if(n === 1) {
         return 1
       }else if(n === 0){ 
         return 1
       }
       return n * factor(n-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('饥人谷', 2, '男');
    getInfo('小谷', 3);
    getInfo('男');
    

    输出:

    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
    

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

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

    如下代码的输出?为什么

    console.log(a);//‘undefind’,在输出之前 a未被赋值
    var a = 1;
    console.log(b);//‘Uncaught ReferenceError: b is not defined’,变量b没有被声明
    

    如下代码的输出?为什么

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

    输出:

    hello  world
    Uncaught TypeError: sayAge is not a function//函数表达式不会像函数声明一样
    被前置,所以执行到sayAge(10);这一句时函数sayAge未被声明,此时它还不是一个函数
    

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

    var x = 10
    bar() 
    function foo() {
      console.log(x)
    }
    function bar(){
      var x = 30
      foo()
    }
    

    输出

    10
    

    作用域链查找过程伪代码:

    
    globalContext = {
       AO:{
          x:10
          foo:function
          bar:function
       }
       Scope:null
    }
    foo.[[scope]] = globalContext.AO
    bar.[[scope]] = globalContext.AO
    
    barContext = {
       AO: {
          x:30
       }
       Scope:bar.[[scope]] = globalContext.AO
    }
    
    fooContext = {
       AO:{}
       Scope:foo.[[scope]] = globalContext.AO
    }
    

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

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      function foo(){
        console.log(x) 
      }
      foo();
    }
    

    输出:

    30
    

    作用域链查找过程伪代码:

    globalContext = {
       AO:{
          x:10
          bar:function
       }
       Scope:null
    }
    bar.[[scope]] = globalContext.AO
    
    barContext = {
       AO:{
          x:30
          foo:function
       }
       Scope:bar.[[scope]] = globalContext.AO
    }
    foo.[[scope]] = barComtext.AO
    
    fooContext = {
       AO:{}
       Scope:foo.[[scope]] = barComtext.AO
    }
    
    

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

    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      (function (){
        console.log(x)
      })()
    }
    

    输出:

    30
    

    作用域链的查找过程伪代码

    globalContext = {
       AO:{
          x:10
          bar:function
       }
       Scope:null
    }
    bar.[[scope]] = globalContext.AO
    
    barContext = {
       AO:{
       x:30
       funciton
    }
       Scope:bar.[[scope]] = globalContext.AO
    }
    function.[[scope]] = barContext.AO
    
    functionContext = {
       AO:{}
       Scope:function.[[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)
    

    输出:

    undefine
    5
    1
    6
    20
    200
    

    作用域链查找过程伪代码:

    globalContext = {
       AO:{
          a:1
          fn:function
          fn3:function
       }
    Scope:null
    }
    fn.[[scope]] = globalContext.AO
    
    fnContext = {
       AO:{
          a:undefind
          fn3:function
          fn2:function
       }
       Scope:globalContext.AO
    }
    fn3.[[scope]] = fnContext.AO
    fn2.[[scope]] = fnContext.AO
    console.log(a)/*在a声明之前打印,undefind*/
    
    fnContext = {
       AO:{
          a:5
          fn3:function
          fn2:function
       }
       Scope:globalContext.AO
    }
    fn3.[[scope]] = fnContext.AO
    fn2.[[scope]] = fnContext.AO
    console.log(a)/*在fn的AO内找a的值,此时a已被赋值5,输出5*/
    
    fn3Context = {
       AO:{
          a:undefined
          Scope:globalContext.AO
       }
    }
    console.log(a)/*在fn3的AO内找a的值,此时a未被声明,于是在全局Context的AO内找
                    a的值,此时a已被赋值1,输出1*/
    
    fn2Context = {
       a:undefined
       Scope:fnContext.AO
    }
    console.log(a)/*在fn2的AO内找a的值,此时a未被声明,于是在fn的AO中找a的值,此时
                    a为6,输出6*/
    
    console.log(a)/*在fn2的AO内找a的值,此时a已被赋值20,输出20*/
    
    console.log(a)/*a被赋值200,输出200*/
    
    
    

    相关文章

      网友评论

          本文标题:函数与作用域

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