javascript面试题

Posted on 2020-04-22 16:19  张雪冬前端学习园地  阅读(179)  评论(0编辑  收藏  举报

javascript面试题

 

 

1.面试题1

 

 var a = {n: 1}
 var b = a
 a.x = a = {n: 2}

console.log(a.n, b.n)     // 2, 1

console.log(a.x, b.x)     // undefined, { n: 2 }


/*
题解:前俩步非常简单,变量a和变量b同时指向一个对象
    
        第三步的时候,我们知道赋值运算符都是从右边开始赋值的,但是

        a.x点的优先级是最高的,因此会先执行a.x,在a和b共同指向的对象

        中添加一个x属性,并且赋值为undefined,要注意是在a变量和b变

        量共同指向的对象上。此时执行从右边开始赋值,在a = { n: 2 }
    
        很显然a被重新指向了一个新对象,此时又把新对象a赋值给,之前

        a和b变量共同指向的对象中的x属性,那么就ok了,b.x可以拿到

        { n: 2 },而a.x是undefined就很正常了,因为此时的a指向的是

        一个新对象,新对象中并没有指定过x属性,b.x可以访问到,是因为b对象指向的还是原来的对象。
            
        */

 

 

2.面试题2

function fun(n, o) {
      console.log(o)
      return {
        fun: function (m) {
          return fun(m, n)
        }
      }
}

var a = _fun_(0)     // undefined

a.fun(1)    // 0

a.fun(1)    // 0

a.fun(1)    // 0


/*

    题解:
    
        1.第一步是undefined很好理解,因为函数中打印的是第二个参数,

         2.指向第二部的时候,此时再函数指向完毕时就会产生一个闭包

        相当于fun(1, 0),此时每次每次调用的时候,都是将闭包中作用域
    
        信息传递到函数指向环境中,供函数执行时获取变量值时使用。
*/


// 如果不好理解请看下面的改造,其运行结构和上面一样

function _fun_(n, o) {
      console.log(o)
      return {
        fun: function (m) {
          return _fun_(m, n)
        }
      }
}

var a = _fun_(0)
a.fun(1)
a.fun(1)
a.fun(1)



// 接下来继续看

function fun(n, o) {
      console.log(o)
      return {
        fun: function (m) {
          return fun(m, n)
        }
      }
}

var a = fun(0).fun(1).fun(2).fun(3)    // undefined 0 1 2

// 可以理解成下面这样

var a = fun(0)

var a1 = a.fun(1)

var a2 = a1.fun(2)

var a3 = a2.fun(3)

/*

    这样看起来就很好理解了,第二次调用a.fun(1)此时产生了一个闭包
    
    第三步a1.fun()的时候,a1对象中有一个闭包引用了fun函数的变量

    所以匿名函数执行的函数调用为_fun_(2,1),输出结果为1, 

    并返回一个新的对象。a2.fun()的时候使用的是a1.fun()调用产生的闭包,以此类推
*/