面试前做几道面试题:有几道是以往面试都出现过,但是每次都掉进坑里的题
今天请教大神给梳理了一遍
第一题:
大神说
记住一点就行了。如果在实例上找不到方法,才会去原型链找,原型链里的this全部指向实例
但如果有return就要注意了
1.return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。
这种情况下,忽视return值,依然返回this对象。
2.return的是Object。
这种情况下,不再返回this对象,而是返回return语句的返回值。
function fn() {
this.a = 0;
this.b = function() {
alert(this.a)
}
}
fn.prototype = {
b: function() {
this.a = 20;
alert(this.a);
},
c: function() {
this.a = 30;
alert(this.a);
}
}
var myfn = new fn();
myfn.b();//0
myfn.c();//30
myfn.b();//30
第二题:
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
第二道题,以 c 为例吧。
fun 的返回值是一个 object,其中有一个属性叫 fun,对应一个 function。
由于只传入一个参数,所以 fun(0) 先输出 undefined,然后返回:
{
fun: function(m) {
return fun(m, 0)
}
}
其中 fun(m, 0) 中的 fun 就是外面定义的 function fun(n, o)。这其实是一个递归。
注意这时是在调用 fun(1, 0),即 n 是 1,o 是 0,因此,就会先输出 0,然后得到 fun 函数的返回值,就是上面说的那个有一个属性叫 fun,对应一个 function 的 object:
{
fun: function(m) {
return fun(m, 1) // 这里的 1 是 n
}
}
这就是 c 变量了。它是一个 object,有一个 fun 属性。
这时候对 c 调用 .fun(2),就是在调用 fun(2, 1)。所以输出 1。
调用 c.fun(3),就是在调用 fun(3, 1)。所以还是输出 1
第二道题我自己梳理了下
a=fun(0) | a.fun(1) | a.fun(2) | a.fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,0) | fun(3,0) |
0 | 0 | 0 |
b= fun(0) | .fun(1) | .fun(2) | .fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,1) | fun(3,2) |
0 | 1 | 2 |
c=fun(0) | .fun(1) | c.fun(2) | c.fun(3) |
---|---|---|---|
undefined | fun(1,0) | fun(2,1) | fun(3,1) |
0 | 1 | 1 |