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()调用产生的闭包,以此类推 */