进阶3

作者: _小黑 | 来源:发表于2017-12-14 15:35 被阅读9次
  1. 函数声明和函数表达式有什么区别
function functionname() {}  

函数声明使用function来进行声明,函数声明提升,所以不论执行语句的位置皆可调用该函数。

var funcitonname = function(){};

函数表达式通过赋值来声明函数,声明完毕后要加上分号表示该句结束,在表达式执行完后,函数才存在并可被调用.

  1. 什么是变量的声明前置?什么是函数的声明前置
    所谓的变量声明前置就是在一个作用域块中,所有的变量都被放在块的开始出声明。
      和变量声明前置一样,执行代码之前会先读取函数声明,只要函数在代码中进行了声明,无论它在哪个位置上进行声明,js引擎都会将它的声明放在范围作用域的顶部。
  2. arguments 是什么
    答:arguments其实是函数的一个内置参数的数组对象,通过arguments[1、2、3]等...我门可以获取到相应的传入参数.
  3. 函数的"重载"怎样实现?
    在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
  1. 立即执行函数表达式是什么?有什么作用?
(function(){
    var a = 1;
})()

作用: 隔离作用域。
  因为JavaScript有很多致命缺陷,以致于各类淫才们开发出各种奇技淫巧来补JavaScript设计和历史遗留问题上的坑。
比如JavaScript中没有命名空间,而且只有function代码块内部可以隔离变量作用域,自调用匿名函数就用来防止变量弥散到全局,以免各种js库冲突。

  1. 求n!,用递归来实现
function factorial(n){
    if (n ===1) {
   return 1;}
   return   n * factorial(n-1);
}
  1. 以下代码输出什么?
image.png
image.png
  1. 写一个函数,返回参数的平方和?


    image.png
function sumOfSquares(){
    var sum = 0;
for ( var i = 0; i < arguments.length; i++) {
    sum = arguments[i]*arguments[i] + sum;
       
}
    return sum;
}
  1. 如下代码的输出?为什么


    image.png

    undefined 第二条会报错,
    因为 变量提升,而第二个就没有定义,所以会报错。

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


    image.png

    第一个结果hello world
    第二个会报错 ,因为第一个是函数声明提升后,而函数表达式在定义之前使用就会报错。

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

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
    }
    x变成30

    3.调用foo()
    fooContext = {
        AO:{},
        Scope:foo.[[scope]] = globalContext.AO
    }
    输出10*/
  1. 如下代码输出什么? 写出作用域链查找过程伪代码
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
       },
       Scope:bar.[[scope]] // globalContext.AO
   }
   foo.[[scope]] = barContext.AO
   3.调用foo()
   fooContext = {
       AO:{},
       scope:foo.[[scope]]
   }
   输出结果为30
*/

  1. 以下代码输出什么? 写出作用域链的查找过程伪代码
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.调用立即执行函数
    functionContext = {
        AO:{},
        Scope:function.[[scope]]//barContext.AO
    }
    结果为30*/
  1. 以下代码输出什么? 写出作用域链查找过程伪代码
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.
    fn3Context = {
        AO:{
            a:200
        },
        Scope:fn3Context.[[scope]]//globalContext.AO
    }
    fn2ConText = {
        AO:{
            a:20
        },
        Scope:fn2ConText.[[scope]]//fnContext.AO
    }

开始执行
    console.log(a)//undefined 打印
    var a = 5//fnContext中a变成5
    console.log(a)//5
    a++//fnContext.AO中a变为6
    调用fn3()
    fn3()中
    console.log(a)//globalContext.AO中的a值为1,打印
    a = 200//globalContext.AO中的a变为200
    调用fn2()
    console.log(a);//fnContext.AO中的a值为6,打印
    a = 20;//fnContext.AO中的a变为20
    继续执行fn()
    console.log(a)//fnContext.AO中的a值为20,打印
    fn()结束
    console.log(a)//globalContext.AO中a值为200,打印

    //输出的结果 undefined 5 1 6 20 200
*/



相关文章

  • Fragment使用三部曲

    1.Fragment进阶 - 基本用法2.Fragment进阶-FragmentTransaction详解3.Fr...

  • to be better(个人记录一些点)

    看见别人整理的可研究的专题:【进阶 1 期】 调用堆栈【进阶 2 期】 作用域闭包【进阶 3 期】 this 全面...

  • webpack进阶【4】:打包后自动生成html [html-w

    打包后自动生成html [html-webpack-plugin插件] 注意: 本进阶在webpack进阶【3】的...

  • 进阶3

    1.函数声明和函数表达式有什么区别 用函数声明,函数名是必须的;用函数表达式,函数名可省略; 用函数声明,函数调用...

  • 进阶3

    1.函数声明和函数表达式有什么区别 使用函数声明来声明的函数不需要放在调用的前面就可以被调用,使用函数表达式声明的...

  • 进阶-3

    1.函数声明和函数表达式有什么区别 构造函数常用的两种方法:函数声明和函数表达式 //函数表达式 var s =...

  • 进阶3

    函数声明和函数表达式有什么区别 使用函数声明,如果函数被提前调用也是可以正常运行的;如果使用函数表达式,和变量提升...

  • 进阶3

    1.函数声明和函数表达式有什么区别 .以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的 以...

  • 进阶3

    函数声明和函数表达式有什么区别 函数声明使用function来进行声明,函数声明提升,所以不论执行语句的位置皆可调...

  • 进阶3

    函数声明和函数表达式 函数声明:function functionName(){}  函数表达式:var fn =...

网友评论

      本文标题:进阶3

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