面試前做幾道面試題:有幾道是以往面試都出現過,但是每次都掉進坑里的題
今天請教大神給梳理了一遍
第一題:
大神說
記住一點就行了。如果在實例上找不到方法,才會去原型鏈找,原型鏈里的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 |