身边的面试题目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_YanYan/article/details/81072361

JS问题


  • 2018-07-16 请问以下函数会输出什么>
//一:主要考查了闭包。二:函数在调用中this的指向。 三:块级作用域。
  var num = 20;
  var obj = {
    num :30,
    fn:(function(num){
      this.num *= 3;
      num += 15;
      var num = 45;
      return function(){
      console.log(num,this);
      //第一次输出45,window对象
      //第二次输出65,obj对象
        this.num *=4;
        num += 20;
        console.log(num);
        //第一次输出65
        //第二次输出85
      }
    })(num)
  }
  var fn = obj.fn;
  fn();
  obj.fn();

闭包

  • 概念
闭包是指有权访问另一个函数作用域中的变量的函数
  • 作用域链和活动对象
    无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量。一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。但是,闭包的情况又有所不同。—-【闭包内部的一个函数,这里暂且定位该栗子中的匿名函数,外部的fn函数执行完之后,虽然其执行环境被弹出栈中,但是这个匿名函数的作用域链仍在引用这个活动对象,扔保留在内存中,知道匿名函数被销毁,外部函数的活动对象才会被销毁】
  • this指向
this指向被用的函数(执行环境)
  • JS模仿块级作用域
    在块级作用域中,this指向window对象。

所以在第一次调用fn()方法时,其实是window.fn(),所以第一次this执行window对象,num由于是当前作用域链的执行环境对外部活动对象的引用所以num这时候为45,即在这个闭包中num为45,而this.num指向的是全局属性num为20,所以最终结果为65

在obj.fn()是,这时候this其实指向obj对象,所以this.num == 30 此时num已经为65,所以num+=20 为85

其实这个里面还涉及到了函数中的变量生命,改日再写。上面的图,改日再画。

  • 2018-07-27 请问为什么console.log(‘b’+’a’+ +’a’+’a’)结果为”baNANa”?
<!DOCTYPE html>
<html lang="zh">

    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Document</title>
        <script type="text/javascript">
            /*
             * 一元运算符,只需要一个操作数
             *  + 正号
             *      - 正号不会对数字产生任何影响
             *  - 负号
             *      - 负号可以对数字进行负号的取反
             * 
             *  - 对于非Number类型的值,
             *      它会将先转换为Number,然后在运算
             *      可以对一个其他的数据类型使用+,来将其转换为number
             *      它的原理和Number()函数一样
             */

            var a = 123;

            a = -a;

            a = true;

            a = "18";

            a = +a;

            /*console.log("a = "+a);
            console.log(typeof a);*/

            var result = 1 + +"2" + 3;

            console.log("result = " + result);
            //count = 6
        </script>
    </head>

    <body>

    </body>

</html>

猜你喜欢

转载自blog.csdn.net/Mr_YanYan/article/details/81072361